我只是想知道dot.net 4中的新任务类是创建一个背景或前景线程?任务是否创建为后台线程?
通常情况下,我会在线程上设置“IsBackground”,但Task上没有这样的属性。
我已经无法找到这在MSDN上的任何文件:-(
我只是想知道dot.net 4中的新任务类是创建一个背景或前景线程?任务是否创建为后台线程?
通常情况下,我会在线程上设置“IsBackground”,但Task上没有这样的属性。
我已经无法找到这在MSDN上的任何文件:-(
应该不是很难验证:
class Program
{
static void Main()
{
Task
.Factory
.StartNew(() => Console.WriteLine(Thread.CurrentThread.IsBackground))
.Wait();
}
}
答案是...
ǝnɹʇ
任务由来自系统线程池的线程执行。来自线程池的线程默认在后台执行。
如果你还不相信一个后台任务的,只是尽量在任务中从访问GUI元素,如:
public async Task<int> ProcessStuff_Async()
{
while(true)
{
label1.Text = "processing next item";
获得运行时异常:
交叉线程操作无效: 控制'label1'从其创建线程以外的线程访问。
就像拥有良好的旧常规后台线程一样。
有一个在MSDN docs信息(截至2017年:-),例如:
来处理这种情况的最好方法......是启动后台线程这 不使用任务工作。运行和等待其结果。这将允许 UI在工作完成时感觉平稳。
该文档甚至有一个部分What happens under the covers
。
+1没有想到这个 - 好方法:-) – Steffen 2011-03-06 09:07:41
我有一个问题,我的所有任务都在调用线程上运行。我将上述精确的代码行粘贴到我的项目中,并报告“错误”。你知道这可能是为什么吗?我正在使用.NET 4.0。 – 2013-04-11 17:37:56
根据这个线程http://stackoverflow.com/questions/7889746/creating-threads-task-factory-startnew-vs-new-thread你不能保证后台线程开始任务时,但你应该是如果你使用TaskCreationOptions.LongRunning。我正在使用该选项,但它仍未创建后台线程。是什么赋予了? – 2013-04-11 17:43:02