【问题标题】:Is it incorrect to return Task.Factory.StartNew( ()=>{ ; } )?返回 Task.Factory.StartNew( ()=>{ ; } ) 是否不正确?
【发布时间】:2023-03-22 10:22:01
【问题描述】:

这是我一直看到的代码--

public Task PossiblyAsyncOperation(bool condition)
    {
        //this condition means i need to do something async, for sure
        if (condition)
             return AsyncOp();

        //since it didnt hit the above condition
        //we're not doing the async op now
        //.....this just feels wrong
        return Task.Factory.StartNew(() => { ; });
    }

当您实际上不打算最终运行异步操作时,是否有更好的返回方式?还是您必须返回一个新的、已开始的任务?这对性能有影响吗?

【问题讨论】:

    标签: c# c#-4.0 asynchronous task-parallel-library


    【解决方案1】:

    如果您使用的是 .Net 4.5,则可以使用 Task.FromResult<T>

    return Task.FromResult<object>(null);
    

    否则你可以编写自己的实现

    public static Task CreateEmptyTask()
    {
        var tcs = new TaskCompletionSource<object>();
        tsc.SetResult(null);
        return tcs.Task;
    }
    

    正如评论所指出的,您也许可以缓存此任务,但请注意,您必须防止它被释放。例如以下将引发异常:

    public static readonly Task EmptyTask = Task.FromResult<object>(null);
    
    Task t = EmptyTask;
    t.Dispose();
    ((IAsyncResult)t).AsyncWaitHandle.WaitOne();
    

    【讨论】:

    • 根据我在您的帖子上所做的研究(这导致我来到这里msdn.microsoft.com/en-us/library/hh228607.aspx),似乎这就是 MSFT 更希望这样做的方式。谢谢你教我。
    • 任务可以重复使用。将其缓存在静态只读字段中,您将拥有更少的开销。
    【解决方案2】:

    您总是可以只创建一个TaskCompletionSource,然后返回 Task 属性。这是一种完全跳过异步调用的方法。

    【讨论】:

      【解决方案3】:

      如果您没有做任何事情并且Task 是一个类,所以是一个引用,为什么不简单地返回一个null..

      public Task PossiblyAsyncOperation(bool condition)
      {
           //this condition means i need to do something async, for sure
           if (condition)
                return AsyncOp();
      
           //since it didnt hit the above condition
           //we're not doing the async op now
           //.....this just feels wrong
           return null; //RETURN NULL
      }
      

      【讨论】:

      • 因为你通常 .ContinueWith() 之后...我想我可以空检查那部分
      • 我不相信 null 是框架或大多数用户代码所期望的,因为 .ContinueWith()null 是不可等待的事实。
      猜你喜欢
      • 2016-09-11
      • 1970-01-01
      • 2015-12-30
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 2020-12-20
      • 2015-05-14
      • 1970-01-01
      相关资源
      最近更新 更多