TaskScheduler.GetScheduledTasks 方法

定義

僅支援除錯器時,會產生目前排隊等待執行的無數 Task 實例。

protected:
 abstract System::Collections::Generic::IEnumerable<System::Threading::Tasks::Task ^> ^ GetScheduledTasks();
[System.Security.SecurityCritical]
protected abstract System.Collections.Generic.IEnumerable<System.Threading.Tasks.Task> GetScheduledTasks();
protected abstract System.Collections.Generic.IEnumerable<System.Threading.Tasks.Task>? GetScheduledTasks();
protected abstract System.Collections.Generic.IEnumerable<System.Threading.Tasks.Task> GetScheduledTasks();
[<System.Security.SecurityCritical>]
abstract member GetScheduledTasks : unit -> seq<System.Threading.Tasks.Task>
abstract member GetScheduledTasks : unit -> seq<System.Threading.Tasks.Task>
Protected MustOverride Function GetScheduledTasks () As IEnumerable(Of Task)

傳回

一個可枚舉物件,允許除錯器遍歷目前排隊到此排程器的任務。

屬性

例外狀況

此排程器目前無法產生排隊任務清單。

備註

由衍生 TaskScheduler 出的類別實作此方法,以支援與除錯器的整合。 此方法僅在除錯器請求存取資料時,.NET 框架會啟動。 回傳的可列資料會被除錯工具遍歷,以存取目前排程器排隊的任務,使除錯器能在使用者介面中提供這些資訊的表示。

值得注意的是,當呼叫此方法時,程序中其他所有執行緒都會被凍結。 因此,避免與其他執行緒同步,避免阻塞非常重要。 如果需要同步,且你無法在此方法取得鎖,則應拋出例外,避免除錯器阻塞。 以下範例展示了 C# 中一種可能的做法:

protected override IEnumerable<Task> GetScheduledTasks()
{
    bool lockTaken = false;
    try
    {
        Monitor.TryEnter(_syncObj, ref lockTaken);
        if (lockTaken)
        {
            return _tasks.ToArray();
        }
        else throw new NotSupportedException();
    }
    finally
    {
    if (lockTaken) Monitor.Exit(_syncObj);
    }}

此外,此方法及回傳的可枚舉狀態不得修改任何全域可見狀態。

回傳的可枚舉物絕不應該是空的。 如果目前沒有排隊任務,則應回傳一個空的可枚舉值。

實作自訂除錯器的開發者不應直接呼叫此方法,應改用內部包裝方法 GetScheduledTasksForDebuggerinternal Task[] GetScheduledTasksForDebugger()。 此包裝方法回傳的是任務陣列,而非可枚舉。 要取得活躍排程器的清單,請使用內部方法 internal static TaskScheduler[] GetTaskSchedulersForDebugger()。 此靜態方法會回傳所有活躍 TaskScheduler 實例的陣列。 接著你可以在每個排程器實例上取得 GetScheduledTasksForDebugger 它的排程任務清單。

適用於

另請參閱