2011-03-06 15 views
64

我只是想知道dot.net 4中的新任务类是创建一个背景或前景线程?任务是否创建为后台线程?

通常情况下,我会在线程上设置“IsBackground”,但Task上没有这样的属性。

我已经无法找到这在MSDN上的任何文件:-(

回答

94

应该不是很难验证:

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

答案是...

ǝnɹʇ

+2

+1没有想到这个 - 好方法:-) – Steffen 2011-03-06 09:07:41

+0

我有一个问题,我的所有任务都在调用线程上运行。我将上述精确的代码行粘贴到我的项目中,并报告“错误”。你知道这可能是为什么吗?我正在使用.NET 4.0。 – 2013-04-11 17:37:56

+7

根据这个线程http://stackoverflow.com/questions/7889746/creating-threads-task-factory-startnew-vs-new-thread你不能保证后台线程开始任务时,但你应该是如果你使用TaskCreationOptions.LongRunning。我正在使用该选项,但它仍未创建后台线程。是什么赋予了? – 2013-04-11 17:43:02

3

如果你指的是使用asyncawait关键字开始Task<T>,那么答案是否定的。从here摘录:。

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

+0

Task.Run(async()=> {....})???那么,我用'async' – deadManN 2017-10-11 06:47:53

0

任务由来自系统线程池的线程执行。来自线程池的线程默认在后台执行。

0

如果你还不相信一个后台任务的,只是尽量在任务中从访问GUI元素,如:

public async Task<int> ProcessStuff_Async() 
{ 
    while(true) 
    { 
     label1.Text = "processing next item"; 

获得运行时异常:

交叉线程操作无效: 控制'label1'从其创建线程以外的线程访问。

就像拥有良好的旧常规后台线程一样。

有一个在MSDN docs信息(截至2017年:-),例如:

来处理这种情况的最好方法......是启动后台线程这 不使用任务工作。运行等待其结果。这将允许 UI在工作完成时感觉平稳。

该文档甚至有一个部分What happens under the covers

相关问题