任务是作为后台线程创建的吗?

Ste*_*fen 75 c#-4.0

我只是想知道dot.net 4中的新Task类是创建后台线程还是前台线程?

通常我会在Thread上设置"IsBackground",但是Task上没有这样的属性.

我无法在MSDN上找到任何这方面的文档:-(

Dar*_*rov 108

不应该很难验证:

class Program
{
    static void Main()
    {
        Task
            .Factory
            .StartNew(() => Console.WriteLine(Thread.CurrentThread.IsBackground))
            .Wait();
    }
}
Run Code Online (Sandbox Code Playgroud)

答案是......

ǝnɹʇ

  • 根据这个帖子http://stackoverflow.com/questions/7889746/creating-threads-task-factory-startnew-vs-new-thread你不能保证在启动一个任务时有一个后台线程,但如果你使用你应该是TaskCreationOptions.LongRunning.我正在使用该选项,它仍然没有创建后台线程.是什么赋予了? (8认同)
  • 爱你的回答:"ǝnɹʇ".非常有趣.谢谢. (4认同)
  • +1没想到这个 - 很好的方法:-) (2认同)
  • 我相信 Moozhe 的问题可能与默认同步上下文有关。行为可能会有所不同,具体取决于您是在 WinForms、WPF、Web 还是控制台应用程序中,因为它们都有不同的默认并发任务调度方式。 (2认同)

Ste*_*ric 8

如果你开始Task<T>使用Task.Run(),那么是的.

如果使用的是asyncawait,则没有.摘自此处:

"async和await关键字不会导致创建额外的线程.异步方法不需要多线程,因为异步方法不能在自己的线程上运行.该方法在当前同步上下文上运行并在线程上使用时间只有当方法处于活动状态时才可以使用Task.Run将CPU绑定的工作移动到后台线程,但后台线程对于只等待结果可用的进程没有帮助."


Mat*_*ans 5

它似乎作为后台线程运行.

看到这个帖子:

运行多个C#任务异步