簡體   English   中英

未在線程池線程上安排任務繼續

[英]Task continuation was not scheduled on thread-pool thread

我正在閱讀有關SynchronizationContext及其與async / await方法( link )一起使用的信息。 據我了解,在SynchronizationContext為null的控制台應用程序中,將使用默認調度程序(即ThreadPool)來調度等待的方法(任務)的繼續。

但是,如果我運行此控制台應用程序,您將從輸出中看到延續在我創建的工作線程上運行:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("MainThreadId=" + Thread.CurrentThread.ManagedThreadId);
        Method1().ContinueWith(t =>
        {
            Console.WriteLine("After Method1. ThreadId=" + Thread.CurrentThread.ManagedThreadId);
        });

        Console.ReadKey();
    }

    public static async Task Method1()
    {
        Console.WriteLine("Method1 => Entered. ThreadId=" + Thread.CurrentThread.ManagedThreadId);

        TaskCompletionSource<bool> completionSource = new TaskCompletionSource<bool>();
        Thread thread = new Thread(() =>
        {
            Console.WriteLine("Method1 => Started new thread. ThreadId=" + Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(2000);
            completionSource.SetResult(true);
        });

        thread.Start();

        await completionSource.Task;

        Console.WriteLine("Method1 => After WorkerThread. ThreadId=" + Thread.CurrentThread.ManagedThreadId);
    }
}

這是輸出:

MainThreadId=10
Method1 => Entered. ThreadId=10
Method1 => Started new thread. ThreadId=11
Method1 => After WorkerThread. ThreadId=11
After Method1. ThreadId=12

如您所見,“ After WorkerThread”與我的workerthread在同一線程上輸出,但不在線程池上輸出。

我發現了一個類似的問題,但是那個家伙正在使用Mono,他們說這是一個錯誤。 在我這邊,我在Visual Studio中構建了此代碼,並在計算機上安裝的Windows 7和.Net 4.5.2下運行了該代碼。

有人可以解釋一下這種行為嗎?

這是因為我在博客中記錄了一個實現細節 :使用ExecuteSynchronously標志來調度await創建的繼續。 在那種情況下,當該觸發連續時(即,在工作線程上的TaskCompletionSource<T>.SetResult調用中),默認調度程序將首先嘗試確定它是否可以在當前線程上運行。

由於工作線程沒有TaskScheduler會拒絕同步執行任務 ,因此ExecuteSynchronously標志將導致線程池任務調度程序僅同步執行任務 (即在調用線程上)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM