这是我在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(我在库代码中没有),我怎么能实现我的目标呢?
答案 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(...);
}
}
}