C#只用一行将方法封装为基于 Task 的完全异步方法

发布于 2016-12-12  1670 次阅读


好吧,我不愤青了,我最近只是觉得碰到的问题全都能谷歌到,我再写一遍好像没什么意义……但是中文的有关新技术的资料还是很少吧。

这次写一个异步开发中碰到的问题,一个原有的方法我想快速转变为异步的,但是里面调用的很多方法还没有实现 async,或者不支持 async 的部分仍然需要耗费较长时间导致 UI 卡顿,一个快速的方法就是使用.NET 4.5 新增的 Task.Run() 将方法封装为纯异步执行的,上代码(来自我的 BiliRanking 项目):

public static Task<BiliInterfaceInfo> GetInfoTaskAsync(string s) => Task.Run(() =>; GetInfo(s));

GetInfo 就是我原本的方法,其中 BiliInterfaceInfo 是 GetInfo 返回的值,Task<TResult> 是专门给异步返回准备的一个类。如果读者是初次接触 lambda 表达式,可能会对里面的 “=>” 感到束手无措,没关系,我们不使用 lambda 表达式写一下这行代码:

public static Task<BiliInterfaceInfo>; GetInfoTaskAsync2(string s)
{
    return Task.Run<BiliInterfaceInfo>(new Func<BiliInterfaceInfo>;(delegate()
    {
        return GetInfo(s);
    }));
}

是不是就很好理解了?什么?不知道 Func 和 delegate 是什么玩意?我实在是不想展开了,全部展开那还用什么 C#呢 (怎么能吃到巨硬的语言糖呢),我们一起学习一下 C#中的委托, 匿名方法和 Lambda 表达式好了。

那么如果已经在一个方法中使用了支持 async 的方法,但是因为历史问题需要将方法同步执行该怎么办了?写两种实现实在不便于维护。那么请待下回分解,或阅读英文资料及源码:http://stackoverflow.com/a/25097498

特别感谢 DotNet 码农的指导。


寻找属于自己的1%