gpt4 book ai didi

c# - 异步任务。使用 MVVM 运行

转载 作者:太空狗 更新时间:2023-10-29 21:02:33 26 4
gpt4 key购买 nike

我一直在研究新的异步 CTP 和 MVVM 模式。我一直在转换我的一个旧程序,该程序使用后台 worker 并报告进度以更新我的模型中的集合。我已经把它转换成这样了

TaskEx.Run(async () =>
{
while (true)
{
// update ObservableCollection here
}
await TaskEx.Delay(500);
});

在我看来,我绑定(bind)到公开此可观察集合的 View 模型。但是,当我的收藏更新时,出现以下异常

This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread.

我不确定像这样完成后将其拉回到 UI 线程的正确方法是什么。

最佳答案

您不必使用 Task.Run() 或任何其他特殊方法运行异步方法,只需调用它们即可。在您的情况下,这正是导致问题的原因。

给定这样的函数:

Action f = async () =>
{
while (true)
{
// modify the observable collection here
await Task.Delay(500);
}
};

从一些在 UI 线程上运行的方法调用它,比如事件处理程序:

f();

完全按照它应该的方式工作。它执行循环的第一次迭代,然后返回。下一次迭代在 UI 线程上 500 毫秒(或更多,如果 UI 线程繁忙)后执行。

另一方面,如果你这样调用它:

Task.Run(addNames);

它不能正常工作。这样做的原因是 async 方法尝试在它们开始时的相同上下文中继续(除非您明确指定)。第一个版本是在 UI 线程上启动的,所以它在 UI 线程上继续。第二个版本在 ThreadPool 线程上启动(感谢 Task.Run())并继续运行。这就是它导致您出错的原因。

所有这些都是使用 SynchronizationContext 完成的, 如果存在的话。

关于c# - 异步任务。使用 MVVM 运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8460290/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com