CoreDispatcher.RunAsync(CoreDispatcherPriority, DispatchedHandler) 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
從背景工作執行緒排程 UI 執行緒上提供的回呼,並以非同步方式傳回結果。
public:
virtual IAsyncAction ^ RunAsync(CoreDispatcherPriority priority, DispatchedHandler ^ agileCallback) = RunAsync;
/// [Windows.Foundation.Metadata.RemoteAsync]
IAsyncAction RunAsync(CoreDispatcherPriority const& priority, DispatchedHandler const& agileCallback);
[Windows.Foundation.Metadata.RemoteAsync]
public IAsyncAction RunAsync(CoreDispatcherPriority priority, DispatchedHandler agileCallback);
function runAsync(priority, agileCallback)
Public Function RunAsync (priority As CoreDispatcherPriority, agileCallback As DispatchedHandler) As IAsyncAction
參數
- priority
- CoreDispatcherPriority
指定事件分派的優先順序。 將此設定為 CoreDispatcherPriority.Normal。
- agileCallback
- DispatchedHandler
發送器在分派事件時傳回的回呼。
傳回
物件,提供已完成非同步事件分派的處理常式。
- 屬性
範例
下列範例示範如何使用 Dispatcher.RunAsync 來使用 CoreWindow的事件發送器,在主要 UI 執行緒上排程工作。
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
rootPage.NotifyUser("The toast encountered an error", NotifyType.ErrorMessage);
});
var ignored = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
Scenario3OutputText.Text += outputText;
});
TimerTextBlock().Dispatcher().RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, [=]()
{
++m_count;
std::wstringstream wstringstream;
wstringstream << L"Total count: " << m_count;
TimerTextBlock().Text(wstringstream.str().c_str());
});
//
_Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal,
ref new Windows::UI::Core::DispatchedHandler([this]()
{
_count++;
TimerTextBlock->Text = "Total Running Time: " + _count.ToString() + " Seconds";
}));
// using CallbackContext::Any
void Playback::DisplayStatus(Platform::String^ text)
{
_Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal,
ref new Windows::UI::Core::DispatchedHandler([=]()
{
_OutputStatus->Text += text + "\n";
}, CallbackContext::Any));
}
備註
如果您是在背景工作執行緒上,而且想要在 UI 執行緒上排程工作,請使用 CoreDispatcher.RunAsync。 一律將優先順序設定為 CoreDispatcherPriority.Normal 或 CoreDispatcherPriority.Low,並確定任何鏈結的回呼也都使用 CoreDispatcherPriority.Normal 或 CoreDispatcherPriority.Low。
注意
當沒有擱置的輸入事件時,會呼叫以 CoreDispatcherPriority.Low 優先順序排程的回呼。 使用 CoreDispatcherPriority.Low 優先順序,讓您的應用程式 UI 更具回應性。 若要排程背景工作,請使用 CoreDispatcher.RunIdleAsync。
若要從 UI 執行緒啟動背景工作執行緒,請勿使用此方法 (CoreDispatcher.RunAsync) 。 請改用其中一個 Windows.System.Threading.ThreadPool.RunAsync 方法多載。
當 CoreDispatcher 開始關閉,但不會在 UI 執行緒上執行指定的回呼時,這個方法就會順利完成。 如果您需要偵測此案例,請使用 CoreDispatcher.TryRunAsync 。
C++/WinRT。 CoreDispatcher.RunAsync的替代方法是winrt::resume_foreground。
等候從背景執行緒傳送的 UI 工作
當您透過呼叫 RunAsync從背景執行緒更新 UI 時,它會排程 UI 執行緒上的工作,並立即將控制權傳回給呼叫端。 如果您需要等候非同步工作完成再傳回,例如,在對話方塊中等候使用者輸入,請勿單獨使用 RunAsync 。 RunAsync 也不會提供方法讓工作將結果傳回給呼叫端。
在此 C# 範例中, RunAsync 會傳回 ,而不需要等候對話方塊的使用者輸入。 (RunAsync 會在 Lambda 運算式 中的程式碼開始執行時立即傳回。)
//DO NOT USE THIS CODE.
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
{
await signInDialog.ShowAsync();
});
// Execution continues here before the call to ShowAsync completes.
在此情況下,針對 C#,您必須搭配 RunAsync 使用 TaskCompletionSource ,以傳回可從背景執行緒等候的工作,藉此暫停執行直到 UI 工作完成為止。
public async Task<ContentDialogResult> SignInAsync()
{
TaskCompletionSource<ContentDialogResult> taskCompletionSource =
new TaskCompletionSource<ContentDialogResult>();
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
{
try
{
taskCompletionSource.SetResult(await signInDialog.ShowAsync());
}
catch (Exception ex)
{
taskCompletionSource.SetException(ex);
}
});
return await taskCompletionSource.Task;
}
提示
建議您從我們的工作程式碼片段程式庫使用此工作程式碼片段程式庫的 RunTaskAsync 擴充方法 。 它提供強固的解決方案,可讓在背景執行緒上執行的程式碼等候必須在 UI 執行緒上執行的工作。 如需程式碼和範例使用方式,請參閱 等候從背景執行緒頁面傳送的 UI 工作。
C++/WinRT。 TaskCompletionSource 不適用於 C++/WinRT。 如需替代選項,請參閱 完成來源範例。
從 .NET 移植
如果您要從 .NET 程式碼移植並使用 Dispatcher.BeginInvoke 和 Dispatcher.Invoke 方法,請注意 CoreDispatcher.RunAsync 是非同步。 沒有同步版本。 將Dispatcher.Invoke變更為CoreDispatcher.RunAsync之後,您的程式碼必須支援Windows 執行階段非同步模式,並針對您選擇的語言使用特定的 Lambda 語法。