如何调用从工作线程更新绑定数据的 viewModel 方法?
How to call viewModel method which updates binding data from worker thread?
我有一个工作线程,它在用户进行每次更改后计算 DataGrid 的数据。在某些情况下,用户更改速度太快,因此在 GUI 线程上我调用
Thread.Abort();
同时在工作线程上我使用了这样的构造
while (true)
{
try
{
_calculateEvent.WaitOne();
...
Application.Current.MainWindow.Dispatcher.BeginInvoke((Action)delegate()
{
_viewModel.UpdateInterfaceFromAssigningInfo(assigningInfo);
});
}
catch (ThreadAbortException)
{
Thread.ResetAbort();
}
}
完全不知道它是否有效,但目前我的主要问题是我无法在 GUI 线程上调用代码来更新界面。在 Invoke
行我有异常:InvalidOperationException
消息
The calling thread cannot access this object because a different
thread owns it.
我通常使用稍微不同的方式:
Application.Current.MainWindow.Dispatcher.BeginInvoke(new Action( ()=>
{
_viewModel.UpdateInterfaceFromAssigningInfo(assigningInfo);
}));
试试吧,可能是个原因。
经过一些研究,我找到了准确满足我需求的信息,因为在我的情况下,我需要在任务中的所有计算完成后才更新 UI。
选项 1.
对于 WPF 应用程序,我们可以受益于 同步上下文任务调度程序 ,它在 GUI 线程上运行任务。因此,可以使用这样的场景在任务完成后更新 GUI:
Task t = Task.Run(() => foo());
t.ContinueWith((task) =>
{
// Update observable properties
}, TaskScheduler.FromCurrentSynchronizationContext());
继续任务将在 GUI 线程上执行,因此将能够更新 GUI。
选项 2
private async void DownloadFileButton_Click(object sender, EventArgs e)
{
// Since we asynchronously wait, the UI thread is not blocked by our code.
await foo();
// Since we resume on the UI context, we can directly access UI elements.
UpdateObservableProperties();
}
我有一个工作线程,它在用户进行每次更改后计算 DataGrid 的数据。在某些情况下,用户更改速度太快,因此在 GUI 线程上我调用
Thread.Abort();
同时在工作线程上我使用了这样的构造
while (true)
{
try
{
_calculateEvent.WaitOne();
...
Application.Current.MainWindow.Dispatcher.BeginInvoke((Action)delegate()
{
_viewModel.UpdateInterfaceFromAssigningInfo(assigningInfo);
});
}
catch (ThreadAbortException)
{
Thread.ResetAbort();
}
}
完全不知道它是否有效,但目前我的主要问题是我无法在 GUI 线程上调用代码来更新界面。在 Invoke
行我有异常:InvalidOperationException
消息
The calling thread cannot access this object because a different thread owns it.
我通常使用稍微不同的方式:
Application.Current.MainWindow.Dispatcher.BeginInvoke(new Action( ()=>
{
_viewModel.UpdateInterfaceFromAssigningInfo(assigningInfo);
}));
试试吧,可能是个原因。
经过一些研究,我找到了准确满足我需求的信息,因为在我的情况下,我需要在任务中的所有计算完成后才更新 UI。
选项 1. 对于 WPF 应用程序,我们可以受益于 同步上下文任务调度程序 ,它在 GUI 线程上运行任务。因此,可以使用这样的场景在任务完成后更新 GUI:
Task t = Task.Run(() => foo());
t.ContinueWith((task) =>
{
// Update observable properties
}, TaskScheduler.FromCurrentSynchronizationContext());
继续任务将在 GUI 线程上执行,因此将能够更新 GUI。
选项 2
private async void DownloadFileButton_Click(object sender, EventArgs e)
{
// Since we asynchronously wait, the UI thread is not blocked by our code.
await foo();
// Since we resume on the UI context, we can directly access UI elements.
UpdateObservableProperties();
}