如何在Windows Store应用程序中等待结果(没有Dispatcher)时,如何将执行传递给任务中的UI线程?

时间:2012-10-08 10:31:42

标签: windows-store-apps winrt-async

这是我在Windows应用商店应用论坛中的问题重复:

我有一个等待返回任务的方法。它被传递给指定的代表做出决定。该任务迭代一些对象并调用委托以确定是否应该处理对象。在经典的.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(我在库代码中没有),我怎么能实现我的目标呢?

1 个答案:

答案 0 :(得分: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(...);
    }
  }
}