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 的事件调度程序在 main 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#,需要结合使用 TaskCompletionSource 和 RunAsync 返回可从后台线程等待的任务,从而暂停执行,直到 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 语法。