WPF 界面刷新问题 不支持从调度程序线程以外的线程对其 SourceCollection 进行的更改
问题描述:
在子线程中操作界面控件的数据源出现以下错误:System.NotSupportedException:“该类型的 CollectionView 不支持从调度程序线程以外的线程对其 SourceCollection 进行的更改。”
如图所示:
例:
一个按钮 的Click事件要做一些事情,但我不希望程序在处理这些事情的时候把界面卡住时。这时我会开一个线程Task让它去执行。这样就不会卡界面了。在执行这些逻辑的时候我还希望在界面可以实时的看到执行中反馈的数据和信息。这时就要刷新界面控件的数据了。这时就是出现这样的报警。怎么解决呢,接着看下去。
代码
/// <summary>
/// 标定测试
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Btn_Test_Click(object sender, RoutedEventArgs e)
{
//addTestPosList();
try
{
Task.Factory.StartNew(() =>
{
Global.GlobalIns.IsStartWeld = true;
Global.WeldPointCalculateing = true;
WorkFlow.CalculateWeldPoint(true, 10000);
Global.WeldPointCalculateing = false;
Global.WeldPointCalculateComplete = true;
System.Windows.Application.Current.Dispatcher.Invoke((Action)(() =>
{
//报错:该类型的 CollectionView 不支持从调度程序线程以外的线程对其 SourceCollection 进行的更改
//使用System.Windows.Application.Current.Dispatcher.Invoke((Action)(() => 方法解决
getPoints();
}));
});
}
catch (Exception ex)
{
WorkFlow.ShowMsgError(ex.Message, "Btn_Test_Click");
}
}
解决方法
在操作界面控件的数据源时回归UI线程进行操作,如下所示:
System.Windows.Application.Current.Dispatcher.Invoke((Action)(() =>
{
//报错:该类型的 CollectionView 不支持从调度程序线程以外的线程对其 SourceCollection 进行的更改
//使用System.Windows.Application.Current.Dispatcher.Invoke((Action)(() => 方法解决
getPoints();
}));
END