0

これは、Windows ストア アプリ フォーラムでの私の質問の複製です。

Task を返す待機可能なメソッドがあります。決定を下すために指定された代理人を通過します。タスクは、いくつかのオブジェクトを繰り返し処理し、デリゲートを呼び出して、オブジェクトを処理する必要があるかどうかを判断します。従来の .NET では、次のように実装します。

private Task ProcessDemo(Func<int, bool> processDecisionHandler)
{
   // Get the current SynchronizationContext
   SynchronizationContext synchronizationContext = SynchronizationContext.Current;

   return Task.Run(() =>
   {
      for (int i = 0; i < 10; i++)
      {
         // Invoke the process decision handler in the UI thread 
         bool process = false;
         synchronizationContext.Send((state) => { process = processDecisionHandler(i); }, i);
         if (process)
         {
            // Process the item
            ...
         }
      }
   });
}

このメソッドは、次のように呼び出すことができます。

private async void testButton_Click(object sender, RoutedEventArgs e)
{
   this.WriteLine("UI-Thread ({0})", Thread.CurrentThread.ManagedThreadId);

   Func<int, bool> handler = (i) =>
   {
      if (MessageBox.Show("Process " + i + "?", this.Title, MessageBoxButton.YesNo, MessageBoxImage.Information) == MessageBoxResult.Yes)
      {
         return true;
      }
      else
      {
         return false;
      }
   };

   await this.ProcessDemo(handler);
}

Windows ストア アプリでは、SynchronizationContext の Send メソッドが使用できないという問題に直面しています。ハンドラーの結果を「待つ」必要があるため、投稿は明らかに私の目標には機能しません。

Dispatcher (ライブラリコードにはありません) なしで、どうすれば目標を達成できますか?

4

1 に答える 1

0

常にUIスレッドから呼び出される場合は、次のように実行できます。

private Task ProcessDemo(Func<int, bool> processDecisionHandler)
{
  for (int i = 0; i < 10; i++)
  {
    // Invoke the process decision handler in the UI thread
    if (processDecisionHandler(i))
    {
      // Process the item on a threadpool thread.
      await Task.Run(...);
    }
  }
}
于 2012-10-08T11:05:33.340 に答える