語言

JoinableTaskContext 類別

定義

一個共同的情境,讓可合併的任務可以被創建並互動,以避免死結。

public ref class JoinableTaskContext : IDisposable, Microsoft::VisualStudio::Threading::IHangReportContributor
public class JoinableTaskContext : IDisposable, Microsoft.VisualStudio.Threading.IHangReportContributor
type JoinableTaskContext = class
    interface IHangReportContributor
    interface IDisposable
Public Class JoinableTaskContext
Implements IDisposable, IHangReportContributor
繼承
JoinableTaskContext
實作

備註

使用或互動 JoinableTasks 時,有三條規則必須嚴格遵守:1. 如果某方法有特定的執行緒公寓需求(STA 或 MTA),它必須:a) 擁有非同步簽章,並且如果該執行緒原本不是在相容執行緒中被調用,則非同步會送至適當的執行緒。 建議切換到主討論串的方式是:

await JoinableTaskFactory.SwitchToMainThreadAsync();

b) 擁有同步簽章,並在錯誤執行緒呼叫時拋出例外。 特別是,任何方法都不允許同步將工作組織到另一個執行緒(在該工作進行時阻塞)。 一般來說,同步區塊應盡可能避免使用。 2. 當已發佈的公開 API 實作必須呼叫非同步程式碼並區塊完成時,必須依照以下簡單模式執行:

JoinableTaskFactory.Run(async delegate {
    await SomeOperationAsync(...);
});
  1. 如果有尚未完成的工程,該工程必須加入。 例如,某項服務啟動了一些非同步工作,之後可能會變成同步阻塞:
JoinableTask longRunningAsyncWork = JoinableTaskFactory.RunAsync(async delegate {
    await SomeOperationAsync(...);
});

然後之後,這種非同步工作會變成阻塞:

longRunningAsyncWork.Join();

或者說:

await longRunningAsyncWork;

不過請注意,當等待是在啟動非同步操作後立即執行時,這個額外步驟並非必要。

建構函式

名稱 Description
JoinableTaskContext()

假設目前執行緒是主執行緒,初始化該類別的新實例 JoinableTaskContext ,並提供 Current 從其他執行緒切換到主執行緒的方法。

JoinableTaskContext(Thread, SynchronizationContext)

初始化 JoinableTaskContext 類別的新執行個體。

屬性

名稱 Description
Factory

取得工廠,產生不屬於可加入任務集合的可加入任務。

IsNoOpContext

會取得一個值,表示此實例是否與任何主執行緒相關聯(例如,使用 CreateNoOpContext()S 建立)。

IsOnMainThread

會獲得一個值,表示呼叫者是否正在主執行緒執行。

IsWithinJoinableTask

會取得一個值,表示呼叫者目前是否在可加入任務的情境中執行。

MainThread

取得可由此上下文建立任務共享的主執行緒。

NoMessagePumpSynchronizationContext

會得到一個 SynchronizationContext ,當應用時,會抑制在呼叫執行緒同步區塊中可能執行的任何訊息泵。

方法

名稱 Description
Capture()

擷取呼叫者的上下文,並將其序列化為適合透過後續呼叫應用的 RunAsync(Func<Task>, String, JoinableTaskCreationOptions)字串。

CreateCollection()

建立一個用於飛行中可加入任務的集合。

CreateDefaultFactory()

建立一個沒有 JoinableTaskCollection的工廠。

CreateFactory(JoinableTaskCollection)

建立一個可加入的任務工廠,自動將所有已建立的任務加入一個可共同加入的集合。

CreateNoOpContext()

初始化一個新的類別實例 JoinableTaskContext ,該類別已設定為在呼叫時 SwitchToMainThreadAsync(CancellationToken)no-op。

Dispose()

一個共同的情境,讓可合併的任務可以被創建並互動,以避免死結。

Dispose(Boolean)

處理此實例所持有的可管理與非管理資源。

GetHangReport()

為懸掛報告提供數據。

IsMainThreadBlocked()

會取得一個值,表示主執行緒是否被阻塞以等待呼叫者的完成。

IsMainThreadMaybeBlocked()

是否阻塞主執行緒以完成呼叫者,會得到一個非常可能的值。 當 UI 執行緒阻擋任務剛開始且尚未被封鎖,或是依賴鏈剛被移除時,準確度會降低。 然而,與 IsMainThreadBlocked()不同,此實作無鎖,且在高爭用情境下更快。

OnFalseHangDetected(TimeSpan, Guid)

當先前的掛機報告為誤報時會啟動。

OnHangDetected(TimeSpan, Int32, Guid)

當懷疑主線程發生掛機時會被調用。

SuppressRelevance()

隱藏呼叫者所關聯的任何 JoinableTask,直到回傳值被處置。

明確介面實作

名稱 Description
IHangReportContributor.GetHangReport()

為懸掛報告提供數據。

適用於

執行緒安全性

此類型對所有成員皆為執行緒安全。