个人观点,仅供参考
C#为开发者提供了可以说最好的异步API了,只需要Task.Run即可将原本同步耗时的API转化为异步API,但其中也有个"巨坑"
Demo
看一个简单的例子
public async Task<string> MyTaskAsync(Uri address)
{
return await Task.Run(() =>
{
using (var client = new WebClient())
{
return client.DownloadString(address);
}
});
}
复制代码
乍一眼看这个函数似乎很正常,用一个Task包裹一个耗时的WebClient.DownloadString
函数。但是我们需要问一下自己:
WebClient.DownloadString
是CPU密集型,还是IO密集型- 在Task.Run所在的托管线程里,是阻塞的还是非阻塞的
答案很明确:IO密集型,并且仍然是阻塞的,那么这意味着什么:我们只是换了一个地方阻塞,也就是类似于拆东墙补西墙,这样的代码确实可以使UI不再卡顿,但实际上对于性能的可拓展并没有什么好处。
Solve
解决方案很简单,就