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)

傳回

IEnumerable<Task>

可列舉項目,允許偵錯工具在目前已排入至這個排程器中的工作之間周遊。

屬性

例外狀況

這個排程器無法在這個階段產生佇列的工作清單。

備註

衍生自 TaskScheduler 的類別會實作這個方法,以支援與偵錯工具整合。 只有在偵錯工具要求存取資料時,.NET Framework才會叫用這個方法。 傳回的可列舉會透過偵錯公用程式來周遊,以存取目前排入佇列至此排程器的工作,讓偵錯工具在使用者介面中提供這項資訊的標記法。

請務必注意,呼叫這個方法時,進程中的所有其他執行緒都會凍結。 因此,請務必避免與其他可能導致封鎖的執行緒同步處理。 如果需要同步處理,而且您無法取得此方法中的鎖定,則您應該擲回例外狀況,讓偵錯工具不會封鎖。 下列範例顯示 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);  
    }}  

此外,這個方法和傳回的可列舉狀態不得修改任何全域可見的狀態。

傳回的可列舉不應該是 null。 如果目前沒有已排入佇列的工作,應該改為傳回空的可列舉。

實作自訂偵錯工具的開發人員不應該直接呼叫這個方法,但應該改用內部包裝函式方法 GetScheduledTasksForDebuggerinternal Task[] GetScheduledTasksForDebugger() 。 這個包裝函式方法會傳回工作陣列,而不是可列舉的工作陣列。 若要擷取使用中排程器的清單,請使用內部方法 internal static TaskScheduler[] GetTaskSchedulersForDebugger() 。 這個靜態方法會傳回所有使用 TaskScheduler 中實例的陣列。 然後,您可以在每個排程器實例上使用 GetScheduledTasksForDebugger 來擷取其排程工作清單。

適用於

另請參閱