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

时间:2011-03-06 08:58:13

标签: c#-4.0

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

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

我无法在MSDN上找到任何关于此的文档: - (

5 个答案:

答案 0 :(得分:101)

不应该难以核实:

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

答案是......

ǝnɹʇ

答案 1 :(得分:7)

如果您使用Task<T>开始Task.Run(),则为是。

如果您使用的是asyncawait,请选择否。摘录自here

&#34; async和await关键字不会导致创建其他线程。异步方法不需要多线程,因为异步方法不能在自己的线程上运行。该方法在当前同步上下文上运行,并仅在方法处于活动状态时在线程上使用时间。您可以使用Task.Run将受CPU限制的工作移动到后台线程,但后台线程对于等待结果可用的进程没有帮助。&#34;

答案 2 :(得分:5)

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

见这个帖子:

Running multiple C# Task Async

答案 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部分。