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

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


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

这次写一个异步开发中碰到的问题,一个原有的方法我想快速转变为异步的,但是里面调用的很多方法还没有实现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%