C#Task是否需要任何线程?

时间:2015-05-28 11:44:38

标签: c# .net

我只是在搜索一个任务是否需要任何线程但没有找到任何明确答案的答案。有人可以提供答案或提供链接

这将清楚是否:

  1. 任务在当前线程上运行

  2. 任务创建新主题

  3. 任务使用线程池中的新线程

2 个答案:

答案 0 :(得分:4)

  

我只是在搜索一个任务是否需要任何答案   螺纹

答案是:取决于。它取决于什么?您正在创建(或消费)的Task种类。它可以是你提到的三个中的任何一个。

让我们通过一个例子将其分解:

首先,没有线程:

public Task FooAsync()
{
    return Task.FromResult(false); 
}

调用此方法调用将导致无法创建任何线程。此外,BCL公开的许多异步IO API也会导致在调用异步操作时不使用任何线程。

其次,线程池线程:

public async Task FooAsync()
{
    await Task.Run(() => /* Massive work here*/);
}

此示例将导致在线程池线程上调用委托。

第三,导致创建一个新线程:

public async Task FooAsync()
{
    await Task.Factory.StartNew(_ => Console.WriteLine("Foo"),
                                     CancellationToken.None,
                                     TaskCreationOptions.LongRunning);
}

如您所见,Task是对将来完成的工作单元的抽象。您可以使用这三种方式中的任何一种方式,取决于您在代码执行方面的实际操作。

答案 1 :(得分:2)

简短回答 - 它是线程池顶部的抽象层,支持更简单的异步编程。

来自MSDN:

  

Task对象执行的工作通常是异步执行的   在线程池线程上而不是在主线程上同步   申请线程

进一步深入: https://msdn.microsoft.com/en-us/library/system.threading.tasks.task(v=vs.110).aspx