我想弄清楚为什么会有效。我创建了一个自定义事件和一个从无UI线程触发的进度对象。我将结果事件放在我的自定义事件中,并且我的UI的交叉线程更新仍然有效。这毫无意义。该事件触发并运行其代码,progress事件如何在另一事件中触发。我知道永远不应该这样做。但我无法从逻辑上弄清楚它为什么会起作用。
private void Button_Click(object sender, RoutedEventArgs e)
{
pracViewModel myViewModel = new pracViewModel(5, "Hello");
Progress<int> progress = new Progress<int>();
myViewModel.triggerEvent += (i) =>
{
Debug.WriteLine(i.ToString());
progress.ProgressChanged += (o, result) =>
{
txtBlock1.Text = result.ToString();
};
};
myViewModel.countAsync(progress);
}
class pracViewModel
{
public async void countAsync(Progress<int> progress)
{
await count(progress);
}
private Task count(IProgress<int> progress)
{
return Task.Run(() =>
{
for (int i = 0; i < 100; i++)
{
Task.Delay(1000).Wait();
progress.Report(i);
triggerEvent(i);
}
});
}
}
答案 0 :(得分:2)
Progress<T>
构造函数捕获当前的SynchronizationContext
- 在本例中为UI上下文。
当线程池线程调用Report
时,Progress<T>
将使用该UI上下文,因此UI线程将引发Progress<T>.ProgressChanged
。