c#任务需要任何线程吗?

本文关键字:线程 任何 任务 | 更新日期: 2023-09-27 17:51:02

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

这将清除是否:

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

  2. 任务创建一个新线程

  3. 任务从线程池中使用一个新线程

c#任务需要任何线程吗?

我只是在寻找答案,是否一个任务需要任何线程

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

让我们通过一个例子来解释它:

首先,没有线程:

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

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

第二,threadpool thread:

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是对将来完成的工作单元的抽象。你可以用这三种方式中的任何一种,这取决于你实际在做什么,以及代码的执行。

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

从MSDN:

任务对象执行的工作通常异步执行线程池上的线程,而不是主线程上的同步应用程序线程

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