我在下面尝试了片段:
public Task RunUiTask(Action action)
{
var task = Task.Factory.StartNew(() =>
{
Dispatcher.Invoke(DispatcherPriority.Background, action);
});
return task;
}
private void OnCreateTask(object sender, RoutedEventArgs e)
{
var task = RunUiTask(() =>
{
for(int i=0;i<10;i++)
{
ResultTextBlock.Text += i.ToString();
}
});
task.Wait(); //(a) Program stopped here
ResultTextBlock.Text += "Finished"; //(b) Never called;
}
我无法理解为什么当调用OnCreateTask(按钮单击事件处理程序)时,程序在(a)处停止,而(b)从不被调用。
注意:我知道我可以使用Dispatcher.BeginInvoke来使程序响应,但这不是我关注的问题。
任何人都可以告诉为什么程序在(a)处停止,为什么(b)从未被调用?感谢。
答案 0 :(得分:7)
的召唤
Dispatcher.Invoke(DispatcherPriority.Background, action);
将在您的UI线程中执行Action
,并在执行Action
后返回。
问题是,由于task.Wait()
中的OnCreateTask
,您的UI Thead被阻止,因此Action将永远不会执行,并且您有死锁。
修改强>
您应使用续订和更新task.Wait()
ResultTextBlock.Text
task.ContinueWith(t=>{
ResultTextBlock.Text += "Finished";
}, TaskScheduler.FromCurrentSynchronizationContext());