> ## Content Index
> Fetch the complete content index at: https://blog.skitisu.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# C#只用一行将方法封装为基于Task的完全异步方法
- URL: https://blog.skitisu.com/csharp-one-line-encapsulate-as-task-based-asynchronous-method/
- Published: 2016-12-12T16:27:10.000Z
- Updated: 2019-06-02T17:37:28.000Z
- Author: SkiTiSu
- Tags: 探索, 编程, #Import 2026-10-21 14:41

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

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

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

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

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

是不是就很好理解了？什么？不知道Func和delegate是什么玩意？我实在是不想展开了，全部展开那还用什么C#呢~~（怎么能吃到巨硬的语言糖呢）~~，我们一起学习一下[C#中的委托,匿名方法和Lambda表达式](http://www.cnblogs.com/niyw/archive/2010/10/07/1845232.html?ref=blog.skitisu.com)好了。

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

特别感谢DotNet码农的指导。