繁体   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