在TPL中返回一个空的静态任务是一种不好的做法

本文关键字:一种 任务 TPL 返回 一个 静态 | 更新日期: 2023-09-27 18:05:28

在某些情况下,我希望有条件地运行任务。我使用了这样的扩展方法:

public static class MyTaskExtension{
  private static Task theEmptyTask = Task.Factory.StartNew(() => {}); //This is the question
  public static Task ContinueWith(this Task task, Task continuationTask, Func<bool> condition)
  {
    if condition(){
       ... do the work
    }
    return theEmptyTask;
  }
}

我的期望是theEmptyTask将已经完成,所以基本上,如果我不想做任何事情,我只是返回这个任务,而不是null或一个新的空任务。

我有一种感觉,这种方法应该有一些故障。有人看到了吗?

在TPL中返回一个空的静态任务是一种不好的做法

在某些上下文中返回已经完成的任务是完全可以接受的。这不是一件特别经常做的事,但它确实在做。

使用单个静态完成任务也没有任何问题。没有必要有一大堆完全相同的不同任务,因为一旦它们完成,如果它们没有结果,重用它们并没有什么错。

注意,如果您想返回一个已经完成的任务,您可以使用Task.FromResult来生成一个开销比您现在所做的要少的任务,因为您不会创建一个空方法,调度它,等待它启动,然后让它立即完成。只返回Task.FromResult(false)会给你一个已经完成的任务。

如果你使用的是。net 4.0,你可以很容易地创建自己的FromResult:

public static Task FromResult<T>(T result)
{
    var tcs = new TaskCompletionSource<T>();
    tcs.SetResult(result);
    return tcs.Task;
}

只要你递回一个任务,是在完成状态(使用TaskCompletionSource来做到这一点),我不能想到任何问题,因为没有真正的任何设置在Task类,将允许客户端与您的静态空任务。他们可以在你的任务上调用Dispose(),但我不认为这会造成任何伤害(即我不认为它会影响检查任务属性的能力(还没有尝试过——值得测试一下))。