簡體   English   中英

在TPL中返回一個空的靜態任務是一種不好的做法?

[英]is returning an empty static task in TPL a bad practice?

有些情況下我想要有條件地運行任務。 我使用某種類似的擴展方法:

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或一個新的空任務。

我覺得這種方法應該有一些小問題。 有人能看到嗎?

在某些情況下返回已完成的任務是完全可以接受的。 這不是特別經常做的事情,但已經完成了。

僅使用一個靜態完成的任務也沒有任何錯誤。 沒有必要讓一大堆不同的任務完全相同,因為一旦它們完成,如果它們沒有結果,重復使用它們沒有任何問題。

請注意,如果要返回已完成的任務,可以使用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類上實際上沒有任何setter允許客戶端搗亂你的靜態空任務。 他們可以在你的任務上調用Dispose() ,但我認為這不會造成任何傷害(即我認為它不會影響檢查任務屬性的能力(沒有嘗試過 - 某些東西)值得測試))。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM