技巧:Task.CompletedTask、Task.Result

dotNET全栈开发

共 2048字,需浏览 5分钟

 ·

2021-06-13 17:01




在任何返回Task的方法中,如果可以在不进行异步的情况下计算结果,则最好避免使用Task.Run。例如,一个简短的计算函数,或者测试中返回了一个预先计算过的结果,则无需使用Task.Run。


例如,定义了一个返回Task的接口方法,但是在实现中,并没有特别耗时的代码。

public interface IComputer    {        Task Do();    Task<string> DoString();}
一般我们会这样实现。即使实现中代码很简短。
public class Computer : IComputer    {        public Task Do()        {          return Task.Run(() => {            //逻辑代码         });    }    public Task<string> DoString()            {                return Task.Run( () => {        //逻辑代码 return "aaa";        });     }}
实际上,Task类上面有两个帮助程序,,这些帮助程序让代码更具可读性,并且所需的运行时开销更少。

对于上述接口实现中的 Do方法,我更愿意使用Task.CompletedTask。

public Task Do()        {                    //逻辑代码        return Task.CompletedTask;    }


我们看一下CompletedTask的定义

/// <summary>Gets a task that has already completed successfully.</summary>/// <returns>The successfully completed task.</returns>public static Task CompletedTask { get; }

如果返回Task <T>怎么办?在这种情况下,如果您已经有了答案,请使用Task.FromResult包装答案。


public Task<string> DoString() {    //逻辑代码    return Task.FromResult("aaa");}

看一下FromResult的定义

/// <summary>Creates a <see cref="T:System.Threading.Tasks.Task`1" /> that's completed successfully with the specified result.</summary>/// <param name="result">The result to store into the completed task.</param>/// <typeparam name="TResult">The type of the result returned by the task.</typeparam>/// <returns>The successfully completed task.</returns>public static Task<TResult> FromResult<[Nullable(2)] TResult>(TResult result);

通过上述的改变,即实现了接口的实现,也减少了Task.Run调用的系统开销。







回复 【关闭】广
回复 【实战】获取20套实战源码
回复 【被删】
回复 【访客】访
回复 【小程序】学获取15套【入门+实战+赚钱】小程序源码
回复 【python】学微获取全套0基础Python知识手册
回复 【2019】获取2019 .NET 开发者峰会资料PPT
回复 【加群】加入dotnet微信交流群

输入任意文字即可激活,这款软件爱了!


再见Vip,免费看网飞影视大片!


浏览 99
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报