TaskScheduler.GetScheduledTasks 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
僅限偵錯工具支援,針對目前已排入至排程器中等候執行的 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 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。 如果目前沒有已排入佇列的工作,應該改為傳回空的可列舉。
實作自訂偵錯工具的開發人員不應該直接呼叫這個方法,但應該改用內部包裝函式方法 GetScheduledTasksForDebugger
: internal Task[] GetScheduledTasksForDebugger()
。 這個包裝函式方法會傳回工作陣列,而不是可列舉的工作陣列。 若要擷取使用中排程器的清單,請使用內部方法 internal static TaskScheduler[] GetTaskSchedulersForDebugger()
。 這個靜態方法會傳回所有使用 TaskScheduler 中實例的陣列。 然後,您可以在每個排程器實例上使用 GetScheduledTasksForDebugger
來擷取其排程工作清單。