根据我在MSDN上阅读的内容
async和await关键字不会创建额外的线程。异步方法不需要多线程,因为异步方法不在自己的线程上运行。该方法在当前同步上下文中运行,并且仅在方法处于活动状态时才使用线程上的时间。您可以使用Task.Run将CPU绑定的工作移动到后台线程,但是后台线程无法帮助等待结果可用的进程。
基本上它是说不会创建线程。但是在我继承的类HttpClient
中,我发现了一些有趣的东西...
async Task<T> SendAsync<T>(HttpMethod method, Uri uri, HttpContent content, CancellationToken cancellationToken)
{
HttpRequestMessage msg = new HttpRequestMessage(method, uri);
msg.Content = content;
//On Main Thread
HttpResponseMessage response = await SendAsync(msg, cancellationToken);
//On worker thread
//...
}
该方法在
static void Main
内部被调用。Task result = client.GetAsync<string>(...);
//GetAsync calls await SendAsync<T>
result.Wait();
为什么在 await SendAsync
调用后我会进入一个单独的线程??我认为异步不会创建新的线程。或者至少在 await 后会回到原始线程。