C# 异步陷阱

时间:2025-03-11 07:31:26

个人观点,仅供参考

C#为开发者提供了可以说最好的异步API了,只需要即可将原本同步耗时的API转化为异步API,但其中也有个"巨坑"

Demo

看一个简单的例子

public async Task<string> MyTaskAsync(Uri address) 
{
    return await (() =>
    {
        using (var client = new WebClient()) 
        {
            return (address);
        }
    });
}
复制代码

乍一眼看这个函数似乎很正常,用一个Task包裹一个耗时的函数。但是我们需要问一下自己:

  1. 是CPU密集型,还是IO密集型
  2. 在所在的托管线程里,是阻塞的还是非阻塞的

答案很明确:IO密集型,并且仍然是阻塞的,那么这意味着什么:我们只是换了一个地方阻塞,也就是类似于拆东墙补西墙,这样的代码确实可以使UI不再卡顿,但实际上对于性能的可拓展并没有什么好处。

Solve

解决方案很简单,就