c#任务需要任何线程吗?
本文关键字:线程 任何 任务 | 更新日期: 2023-09-27 17:51:02
我只是在搜索一个任务是否需要任何线程的答案,但没有找到任何明确的答案。谁能提供答案或提供一个链接
这将清除是否:
-
任务在当前线程上运行
-
任务创建一个新线程
-
任务从线程池中使用一个新线程
我只是在寻找答案,是否一个任务需要任何线程
答案是:这取决于。它取决于什么?你在创建(或消费)哪种类型的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