我看不到看到哪些任務正在運行的方法。有Task.Current屬性,但如果有多個任務正在運行?有沒有辦法獲得這種信息?有沒有辦法分辨任務並行庫中的哪些任務正在運行?
另外,是否有內置的方式來獲得通知,當一個任務開始或完成?
我看不到看到哪些任務正在運行的方法。有Task.Current屬性,但如果有多個任務正在運行?有沒有辦法獲得這種信息?有沒有辦法分辨任務並行庫中的哪些任務正在運行?
另外,是否有內置的方式來獲得通知,當一個任務開始或完成?
嘿邁克,沒有公共方式訪問TPL中的待處理任務列表。使調試器可用的機制依賴於所有線程都將在枚舉時被凍結的事實,因此它不能在運行時使用。
是的,有一個內置的方式來獲得任務完成通知。查看Task.ContinueWith API。基本上這個API創建了一個新的任務,當目標任務完成時會啓動。
我假設你想基於此做一些快速的會計/進度報告,如果是這樣的話,我建議你用TaskContinuationOptions.ExecuteSynchronously標誌調用task.ContinueWith()。如果指定繼續操作將在目標任務完成時在同一線程上運行(如果未指定此任務,則繼續任務將像其他任何常規任務一樣排隊)。
希望這會有所幫助。
玉山
您可以從所提供的一個TaskScheduler
類派生。在這個類中你可以完全控制,並且可以在執行的任何一方添加日誌記錄。例如,請參閱:http://msdn.microsoft.com/en-us/library/ee789351.aspx
您還需要使用Taskfactory
以及類的實例作爲調度程序。
你也可以得到反映當前正在運行的任務(或任務的父):
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();
}
}
};
你需要得到它的編程方式,或者這對於調試?如果是用於調試,您是否知道可用於任務的新調試視圖? – 2009-10-11 19:35:34
我想通過編程獲得它。我看到了新的調試視圖,它們是很棒的東西,但不是我在這種情況下需要的東西。 – 2009-10-11 19:36:55