[英]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.