JoinableTaskContext 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
一個共同的情境,讓可合併的任務可以被創建並互動,以避免死結。
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(...);
});
- 如果有尚未完成的工程,該工程必須加入。 例如,某項服務啟動了一些非同步工作,之後可能會變成同步阻塞:
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() |
為懸掛報告提供數據。 |
適用於
執行緒安全性
此類型對所有成員皆為執行緒安全。