我有一个工作线程,用于在每个更改用户完成后计算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
并带有消息
调用线程无法访问此对象,因为它不同 线程拥有它。
答案 0 :(得分:0)
我通常使用略有不同的方式:
Application.Current.MainWindow.Dispatcher.BeginInvoke(new Action( ()=>
{
_viewModel.UpdateInterfaceFromAssigningInfo(assigningInfo);
}));
尝试,可能是一个原因。
答案 1 :(得分:0)
经过一些研究,我发现信息可以准确满足我的需求,因为在我的情况下,我需要在任务中的所有计算完成后才更新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();
}