我只是想知道dot.net 4中的新Task类是创建后台线程还是前台线程?
通常我会在Thread上设置“IsBackground”,但是在Task上没有这样的属性。
我无法在MSDN上找到任何关于此的文档: - (
答案 0 :(得分:101)
不应该难以核实:
class Program
{
static void Main()
{
Task
.Factory
.StartNew(() => Console.WriteLine(Thread.CurrentThread.IsBackground))
.Wait();
}
}
答案是......
ǝnɹʇ
答案 1 :(得分:7)
如果您使用Task<T>
开始Task.Run()
,则为是。
如果您使用的是async
和await
,请选择否。摘录自here:
&#34; async和await关键字不会导致创建其他线程。异步方法不需要多线程,因为异步方法不能在自己的线程上运行。该方法在当前同步上下文上运行,并仅在方法处于活动状态时在线程上使用时间。您可以使用Task.Run将受CPU限制的工作移动到后台线程,但后台线程对于等待结果可用的进程没有帮助。&#34;
答案 2 :(得分:5)
答案 3 :(得分:0)
任务由来自系统线程池的线程执行。默认情况下,来自线程池的线程在后台执行。
答案 4 :(得分:-1)
如果您还不确定后台任务,只需尝试从任务中访问GUI元素,如:
public async Task<int> ProcessStuff_Async()
{
while(true)
{
label1.Text = "processing next item";
获取运行时异常:
跨线程操作无效: 控制'label1'从其创建的线程以外的线程访问。
就像旧的常规背景线程一样。
MSDN docs中有信息(截至2017年:-),例如:
处理此问题的最佳方法是启动后台主题 使用 Task.Run 进行工作,等待其结果。这将允许 随着工作的进行,用户界面感觉很顺畅。
此文档甚至包含What happens under the covers
部分。