【发布时间】:2011-03-06 08:58:12
【问题描述】:
我只是想知道 dot.net 4 中的新任务类是创建后台线程还是前台线程?
通常我会在线程上设置“IsBackground”,但在任务上没有这样的属性。
我在 MSDN 上找不到任何相关文档 :-(
【问题讨论】:
标签: c#-4.0
我只是想知道 dot.net 4 中的新任务类是创建后台线程还是前台线程?
通常我会在线程上设置“IsBackground”,但在任务上没有这样的属性。
我在 MSDN 上找不到任何相关文档 :-(
【问题讨论】:
标签: c#-4.0
应该不难验证:
class Program
{
static void Main()
{
Task
.Factory
.StartNew(() => Console.WriteLine(Thread.CurrentThread.IsBackground))
.Wait();
}
}
答案是……
ǝnɹʇ
【讨论】:
如果您使用Task.Run() 启动Task<T>,那么可以。
如果您使用的是async 和await,则不需要。摘自here:
“async 和 await 关键字不会导致创建额外的线程。async 方法不需要多线程,因为 async 方法不会在自己的线程上运行。该方法在当前同步上下文上运行并使用时间仅当方法处于活动状态时才在线程上运行。您可以使用 Task.Run 将 CPU 绑定的工作移至后台线程,但后台线程对等待结果可用的进程没有帮助。”
【讨论】:
【讨论】:
任务由来自系统线程池的线程执行。来自线程池的线程默认在后台执行。
【讨论】:
如果您还不相信后台任务,只需尝试从任务中访问 GUI 元素,例如:
public async Task<int> ProcessStuff_Async()
{
while(true)
{
label1.Text = "processing next item";
获取运行时异常:
跨线程操作无效: 控件“label1”从创建它的线程以外的线程访问。
就像旧的常规后台线程一样。
MSDN docs 中有信息(截至 2017 年 :-),例如:
处理这个问题的最好方法是启动一个后台线程 使用Task.Run 完成工作,并await 结果。这将允许 UI 在工作完成时感觉流畅。
这个文档甚至有一个部分What happens under the covers。
【讨论】: