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 のイベント ディスパッチャーを使用してメイン 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 を使用するようにしてください。

Note

CoreDispatcherPriority.Low 優先度でスケジュールされたコールバックは、保留中の入力イベントがない場合に呼び出されます。 CoreDispatcherPriority.Low 優先度を使用して、アプリの UI の応答性を高めます。 バックグラウンド タスクをスケジュールするには、 CoreDispatcher.RunIdleAsync を使用します

UI スレッドからワーカー スレッドをスピンオフするには、このメソッド (CoreDispatcher.RunAsync) を使用しないでください。 代わりに、 Windows.System.Threading.ThreadPool.RunAsync メソッド オーバーロードのいずれかを使用します。

このメソッドは、CoreDispatcher がシャットダウンを開始したときに正常に完了しますが、UI スレッドで指定されたコールバックは実行されません。 このケースを検出する必要がある場合 は、CoreDispatcher.TryRunAsync を使用します。

C++/WinRTCoreDispatcher.RunAsync の代わりに、winrt::resume_foregroundがあります。

バックグラウンド スレッドから送信された UI タスクを待機する

RunAsync を呼び出してバックグラウンド スレッドから UI を更新すると、UI スレッドでの作業がスケジュールされ、呼び出し元に制御がすぐに返されます。 非同期処理が完了するまで待機してから、ダイアログ ボックスでユーザー入力を待機する場合など、返す必要がある場合は、 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 と組み合わせて使用して、バックグラウンド スレッドから待機できるタスクを返し、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++/WinRTTaskCompletionSource は C++/WinRT では使用できません。 別のオプションについては、「 A completion source sample」を参照してください。

.NET からの移植

.NET コードから移植していて、 Dispatcher.BeginInvoke メソッドと Dispatcher.Invoke メソッドを使用している場合は、 CoreDispatcher.RunAsync が非同期であることに注意してください。 同期バージョンはありません。 Dispatcher.InvokeCoreDispatcher.RunAsync に変更した後、コードはWindows ランタイム非同期パターンをサポートし、選択した言語に固有のラムダ構文を使用する必要があります。

適用対象

こちらもご覧ください