正在恢复中TPL一个空的静态任务不好的做法?(is returning an empty stati

2019-08-17 20: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或一个新的空任务。

我有一种感觉,应该有一定的毛刺用这种方法。 任何人都可以看到?

Answer 1:

这是完全可以接受的在某些情况下返回一个已经完成的任务。 这不是东西,尤其经常做的,但它完成。

还有没有什么错处均采用只使用一个静态完成的任务。 有没有必要有一大堆的那都是相同的因为一旦他们完成不同的任务,如果他们有没有结果,没有什么错重用他们。

请注意,如果你想返回一个已经完成的任务,你可以使用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;
}


Answer 2:

只要你交还任务是在完成状态(使用TaskCompletionSource做到这一点),我不能这样认为任何问题的,因为有没有真正的任何setter方法Task类,将允许客户端与静态空任务淤泥。 他们可致电Dispose()在执行任务上,但我不认为会造成任何伤害(即我不认为这会影响检查的任务的属性的能力(还没有尝试过了-什么值得检验出来))。



文章来源: is returning an empty static task in TPL a bad practice?