gpt4 book ai didi

c# - 我应该如何在线程之间同步?

转载 作者:行者123 更新时间:2023-11-30 14:38:46 25 4
gpt4 key购买 nike

考虑以下应用架构:

UI( View )线程创建一个 ViewModel。

ViewModels 构造函数请求业务逻辑对象(提供者)开始从存储中检索数据。

它通过订阅提供者的 DataRecieved 事件并调用 StartRetrievingData() 方法来实现。

Provider 在 StartRetrievingData() 方法主体中创建一个后台线程,循环获取数据并在循环主体中引发 DataRecieved 事件,将实际数据对象作为自定义 EventArgs 公共(public)字段传递。

链接到 DataRecieved 事件的 ViewModel 方法然后更新 UI 元素绑定(bind)到的 observableCollection。

问题是:

MVVM 实现这样的架构是否一切正常?

我应该在什么时候进行线程同步,即调用 Deployment.Current.Dispatcher 来分派(dispatch)源自后台线程的调用以更新 UI?

最佳答案

我个人会处理您的 ViewModel 中的所有同步要求。

如果 View 正在构建 ViewModel,TPL 会为此提供一个很好的机制:

TaskFactory uiFactory;

public YourViewModel()
{
// Since the View handles the construction here, you'll get the proper sync. context
uiFactory = new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext());
}

// In your data received event:
private items_DataReceived(object sender, EventArgs e)
{
uiFactory.StartNew( () =>
{
// update ObservableCollection here... this will happen on the UI thread
});
}

这种方法的好处是您不必将 WPF 相关类型(例如 Dispatcher)引入您的 ViewModel 层,而且它工作起来非常干净。

关于c# - 我应该如何在线程之间同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7392922/

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