2011-09-12 59 views
3

考虑以下应用程序体系结构:我应该如何在线程之间进行同步?

UI(查看)线程创建一个ViewModel。

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

它通过订阅提供程序的DataRecieved事件并调用StartRetrievingData()方法来完成此操作。

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

一个ViewModel方法,链接到DataRecieved事件,然后更新UI元素绑定到的observableCollection。

的问题是:

一切都ok了这样的架构MVVM implemntation?

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

回答

6

我个人会处理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层,它工作得很干净。

+0

非常感谢。我可能应该承认这一点是可耻的,但在你回答之前,我并不知道TPL在.Net中的存在。我的项目仍在Silverlight for Windows Phone上,因此我将无法使用它。便携式TPL不支持我可以看到的TaskFactory。 –

+0

@Maxim:便携式TPL支持这一点 - 但你必须得到TaskScheduler,并明确地将它传递给StartNew方法......不幸的是,它不会让你用自定义调度器创建自己的Factory(不知道为什么 - 但现在在API中缺少) –

相关问题