我试过下面的片段:
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) 从未被调用?谢谢。
最佳答案
的呼唤
Dispatcher.Invoke(DispatcherPriority.Background, action);
将执行
Action
在您的 UI 线程中,并将在 Action
之后返回被执行。问题是,由于
task.Wait()
,您的 UI Thead 被阻止了。在您的 OnCreateTask
,所以 Action 永远不会被执行并且你有一个死锁。编辑
而不是您的
task.Wait()
您应该使用继续和更新 ResultTextBlock.Text
task.ContinueWith(t=>{
ResultTextBlock.Text += "Finished";
}, TaskScheduler.FromCurrentSynchronizationContext());
关于wpf - C#混合使用Task和Dispatcher.Invoke,为什么会停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15500398/