CoreDispatcher.RunAsync(CoreDispatcherPriority, DispatchedHandler) Метод

Определение

Планирует предоставленный обратный вызов в потоке пользовательского интерфейса из рабочего потока и возвращает результаты асинхронно.

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

Обратный вызов, на который диспетчер возвращается при отправке события.

Возвращаемое значение

IAsyncAction

Объект, предоставляющий обработчики для завершенной асинхронной диспетчеризации событий.

Атрибуты

Примеры

В следующих примерах показано использование Dispatcher.RunAsync для планирования работы в основном потоке пользовательского интерфейса с помощью диспетчера событий CoreWindow.

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)); 
}

Комментарии

Если вы находитесь в рабочем потоке и хотите запланировать работу в потоке пользовательского интерфейса, используйте CoreDispatcher.RunAsync. Всегда задайте приоритет CoreDispatcherPriority.Normal или CoreDispatcherPriority.Low и убедитесь, что все связанные обратные вызовы также используют CoreDispatcherPriority.Normal или CoreDispatcherPriority.Low.

Примечание

Обратные вызовы, запланированные с помощью CoreDispatcherPriority.Low priority, вызываются при отсутствии ожидающих событий ввода. Используйте CoreDispatcherPriority.Low priority, чтобы повысить скорость реагирования пользовательского интерфейса приложения. Чтобы запланировать фоновые задачи, используйте CoreDispatcher.RunIdleAsync.

Чтобы отключить рабочий поток из потока пользовательского интерфейса, не используйте этот метод (CoreDispatcher.RunAsync). Вместо этого используйте одну из перегрузок метода Windows.System.Threading.ThreadPool.RunAsync .

Этот метод завершается успешно, когда CoreDispatcher начинает завершать работу, но не выполняет указанный обратный вызов в потоке пользовательского интерфейса. Если необходимо обнаружить этот случай, используйте CoreDispatcher.TryRunAsync .

C++/WinRT. Альтернативой CoreDispatcher.RunAsync является winrt::resume_foreground.

Ожидание задачи пользовательского интерфейса, отправленной из фонового потока

При обновлении пользовательского интерфейса из фонового потока путем вызова RunAsync он планирует работу в потоке пользовательского интерфейса и немедленно возвращает управление вызывающему объекту. Если необходимо дождаться завершения асинхронной работы перед возвращением, например, ожидая ввода данных пользователем в диалоговом окне, не используйте только RunAsync . RunAsync также не предоставляет способ возврата результата вызывающему объекту.

В этом примере C# RunAsync возвращается без ожидания ввода пользователем из диалогового окна. (RunAsync возвращается, как только код в лямбда-выражении начинает выполняться.)

//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, чтобы вернуть задачу, которую можно ожидать от фонового потока, тем самым приостанавливая выполнение до завершения задачи пользовательского интерфейса. Для этого рекомендуется использовать метод расширения RunTaskAsync из библиотеки фрагментов задач. Он предоставляет надежное решение, позволяющее выполнять код в фоновом потоке для ожидания задачи, которая должна выполняться в потоке пользовательского интерфейса. См. задачу await пользовательского интерфейса, отправленную с фоновой страницы потока, для кода и примера использования.

C++/WinRT. TaskCompletionSource недоступен для C++/WinRT. Альтернативный вариант см. в примере источника завершения.

Перенос из .NET

Если вы переносите код .NET и используете методы Dispatcher.BeginInvoke и Dispatcher.Invoke , обратите внимание, что CoreDispatcher.RunAsync является асинхронным. Синхронная версия отсутствует. После изменения Dispatcher.Invoke на CoreDispatcher.RunAsync код должен поддерживать среда выполнения Windows асинхронный шаблон и использовать конкретный лямбда-синтаксис для выбранного языка.

Применяется к

См. также раздел