CoreDispatcher.RunAsync(CoreDispatcherPriority, DispatchedHandler) 方法

定义

计划从工作线程在 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.NormalCoreDispatcherPriority.Low,并确保任何链接的回调也使用 CoreDispatcherPriority.NormalCoreDispatcherPriority.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 线程上的工作,并立即将控制权返回给调用方。 如果需要在返回之前等待异步工作完成(例如,在对话框中等待用户输入),请不要单独使用 RunAsyncRunAsync 也不为任务提供向调用方返回结果的方法。

在此 C# 示例中, RunAsync 返回时不等待对话框中的用户输入。 (RunAsynclambda 表达式 中的代码开始执行时立即返回。)

//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.BeginInvokeDispatcher.Invoke 方法,请注意 CoreDispatcher.RunAsync 是异步的。 没有同步版本。 将 Dispatcher.Invoke 更改为 CoreDispatcher.RunAsync 后,代码必须支持Windows 运行时异步模式,并为所选语言使用特定的 lambda 语法。

适用于

另请参阅