我已经知道async-await
保留线程上下文,还处理异常转发等(这很有帮助)。
但请考虑以下示例:
/*1*/ public async Task<int> ExampleMethodAsync()
/*2*/ {
/*3*/ var httpClient = new HttpClient();
/*4*/
/*5*/ //start async task...
/*6*/ Task<string> contentsTask = httpClient.GetStringAsync("http://msdn.microsoft.com");
/*7*/
/*8*/ //wait and return...
/*9*/ string contents = await contentsTask;
/*10*/
/*11*/ //get the length...
/*12*/ int exampleInt = contents.Length;
/*13*/
/*14*/ //return the length...
/*15*/ return exampleInt;
/*16*/ }
如果async
方法 ( httpClient.GetStringAsync
) 是一个 IO 操作(就像我上面的示例)那么 - 我得到了这些东西:
- 调用者线程未被阻塞
工作线程被释放,因为有一个IO操作(IO 完成端口...)(GetStringAsync 使用TaskCompletionSource
而不是打开一个新线程)- 保留的线程上下文
- 异常被抛出
但是,如果不是httpClient.GetStringAsync
(IO operation) ,我有一个Task of CalcFirstMillionsDigitsOf_PI_Async
(heavy compute bound operation on a sperate thread)
似乎我在这里获得的唯一东西是:
- 保留的线程上下文
- 异常被抛出
- 调用者线程未被阻塞
但我还有另一个线程(并行线程)执行操作。并且cpu在主线程和操作之间切换。
我的诊断是否正确?