Fir*_*oso 7 .net wpf multithreading mvvm
所以我有一个可以由我的GUI执行的任务,该任务将提取信息以使用SQL数据库查询响应填充ViewModel. 假设我想开始这个任务并让我的gui自由地继续其他事情,同时播放"搜索"动画,在WPF/MVVM中执行此操作的正确方法是什么? 我假设你需要启动一个异步进程并设置一个绑定到启动动画故事板的数据触发器的bool.但是我用什么来启动这个过程呢?线?我还是WPF的新手,只是想确保我正在使用适合我的课程.
我使用BackgroundProcess线程来做这样的事情.
这是MSDN的链接:http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
与此相关的其他细节.
您有三个与BackgroundProcess对象关联的事件:DoWork,ReportProgress和WorkCompleted.
现在,用这个 - ,并与一个ObservableCollection使用它 - you'll想告诉BackgroundProcess目的是能够报告进度(这是我始终明确设置一个布尔值属性,随着允许取消).
现在开始一个进程,您将调用RunWorkerAsync方法.如果需要传递数据,此方法可以接受OBJECT变量(如果需要多于1个值,则创建要传递给RunWorkerAsync的结构).
RunWorkerAsync会触发DoWork事件,因此控制将转到DoWork事件处理程序.这是我正在使用它的(已消毒的)代码:
Dim dt As System.Data.DataTable
dt = da.GetDataTable(sql, System.Data.CommandType.Text, params)
For Each row As System.Data.DataRow In dt.Rows
If loadQuestionsWorker.CancellationPending Then
e.Cancel = True
Exit Sub
End If
Dim item As New DataObject
// Assign Item Values
backgroundProcessObject.ReportProgress(1, item)
Next
Run Code Online (Sandbox Code Playgroud)
这里发生的事情是,我从我的数据层获取数据表,然后当这个后台进程没有被取消时,我正在走数据表,当我构建一个新的DataObject时,我将该对象报告为正在构建.
现在,在我的ProgressChanged事件处理程序(的ReportProgress方法引发ProgressChanged事件)的控制是早在UI线程的手,所以我可以做这样的事情影响的用户界面,并添加我汇报到一个ObservableCollection的元素.
最后,在我的WorkedCompleted事件处理(其对应的事件时DoWork的事件处理方法运行完成升起)我检查,看看我的进步被取消了(这有时意味着我要转储的ObservableCollection),我可能会或可能不会影响UI(例如删除"搜索"动画.