2009-10-11 36 views
4

我看不到看到哪些任務正在運行的方法。有Task.Current屬性,但如果有多個任務正在運行?有沒有辦法獲得這種信息?有沒有辦法分辨任務並行庫中的哪些任務正在運行?

另外,是否有內置的方式來獲得通知,當一個任務開始或完成?

+0

你需要得到它的編程方式,或者這對於調試?如果是用於調試,您是否知道可用於任務的新調試視圖? – 2009-10-11 19:35:34

+0

我想通過編程獲得它。我看到了新的調試視圖,它們是很棒的東西,但不是我在這種情況下需要的東西。 – 2009-10-11 19:36:55

回答

3

嘿邁克,沒有公共方式訪問TPL中的待處理任務列表。使調試器可用的機制依賴於所有線程都將在枚舉時被凍結的事實,因此它不能在運行時使用。

是的,有一個內置的方式來獲得任務完成通知。查看Task.ContinueWith API。基本上這個API創建了一個新的任務,當目標任務完成時會啓動。

我假設你想基於此做一些快速的會計/進度報告,如果是這樣的話,我建議你用TaskContinuationOptions.ExecuteSynchronously標誌調用task.ContinueWith()。如果指定繼續操作將在目標任務完成時在同一線程上運行(如果未指定此任務,則繼續任務將像其他任何常規任務一樣排隊)。

希望這會有所幫助。

玉山

2

您可以從所提供的一個TaskScheduler類派生。在這個類中你可以完全控制,並且可以在執行的任何一方添加日誌記錄。例如,請參閱:http://msdn.microsoft.com/en-us/library/ee789351.aspx

您還需要使用Taskfactory以及類的實例作爲調度程序。

3

你也可以得到反映當前正在運行的任務(或任務的父):

static public class Extensions 
{ 
    public static Task Parent(this Task t) 
    { 
     FieldInfo info = typeof(Task).GetField("m_parent", 
      BindingFlags.NonPublic | BindingFlags.Instance); 
     return info != null ? (Task)info.GetValue(t) : null; 
    } 
    public static Task Self 
    { 
     get 
     { 
      return Task.Factory.StartNew(
       () => { }, 
       CancellationToken.None, 
       TaskCreationOptions.AttachedToParent, 
       TaskScheduler.Default).Parent(); 
     } 
    } 
}; 
相關問題