15

在某些情况下,我想有条件地运行任务。我使用某种扩展方法,如下所示:

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 或一个新的空任务。

我觉得这种方法应该有一些小故障。任何人都可以看到吗?

4

2 回答 2

21

在某些情况下返回已经完成的任务是完全可以接受的。这不是特别经常做的事情,但它已经完成了。

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

请注意,如果您想返回一个已经完成的任务,您可以使用它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;
}
于 2013-03-22T13:44:33.513 回答
1

只要您交还处于已完成状态的任务(用于TaskCompletionSource执行此操作),我就不会想到任何问题,因为Task该类上实际上没有任何设置器可以让客户搞砸你的静态空任务。他们可以调用Dispose()您的任务,但我认为这不会造成任何伤害(即我认为这不会影响检查任务属性的能力(尚未尝试过——值得测试的东西) ))。

于 2013-03-22T13:20:21.083 回答