【发布时间】:2016-05-30 18:06:39
【问题描述】:
我创建了以下代码:
using System;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
class Program
{
static void Main()
{
Console.WriteLine("M Start");
MyMethodAsync();
Console.WriteLine("M end");
Console.Read();
}
static async Task MyMethodAsync()
{
await Task.Yield();
Task<int> longRunningTask = LongRunningOperationAsync();
Console.WriteLine("M3");
//and now we call await on the task
int result = await longRunningTask;
//use the result
Console.WriteLine(result);
}
static async Task<int> LongRunningOperationAsync()
{
await Task.Delay(1000);
return 1;
}
}
}
输出:
M Start
M end
M3
1
这很好,但是当我查看线程分析器时,它会显示: 然后这个: 然后这个:
所以看起来我产生了线程,但来自 msdn 说:
来自使用 Async 和 Await 的异步编程:线程
async 和 await 关键字不会导致额外的线程 创建的。异步方法不需要多线程,因为异步 方法不在自己的线程上运行。该方法在当前运行 同步上下文并仅在线程上使用时间 方法处于活动状态。您可以使用 Task.Run 将 CPU 密集型工作移动到 后台线程,但后台线程对进程没有帮助 那只是在等待结果可用。
我是否遗漏或不理解某些内容? 谢谢。
【问题讨论】:
-
它使用线程池中的现有线程,而不是创建一个
-
这看起来像是 Visual Studio 中一个非常漂亮的窗口。很抱歉这个题外话,但哪些版本支持它?
-
用
Thread.CurrentThread.ManagedThreadId装饰你的输出,你可能会看到正在使用3个线程。 -
@GediminasMasaitis 我认为
Parallel Stacks和Task视图都添加到了VS 2013 中。它们都可以在Debug -> Windows下拉菜单下找到。 -
@DinkarThakur,与您的问题有点相关,但您可能有兴趣阅读 Stepen Cleary 的博文“There is no thread”。它深入研究了等待基于 IO 的请求时发生的情况。
标签: c# .net multithreading async-await task