System.InvalidOperationException: '调用线程无法访问此对象,因为另一个线程拥有该对象。'
WPF有个所谓UI线程,后台代码不能直接操作UI控件,跨线程调用UI控件时会出现无法访问对象的错误。
//WPF中跨线程刷新UI控件委托
private delegate void UpdateUIDelegate();
private void UpdateUIThreadShowLines()
{
Thread thread = new Thread(ThreadUpdateUI);
thread.Start();
}
/// <summary>
/// 画图线程
/// </summary>
private void ThreadUpdateUI()
{
UpdateUIDelegate updateUIDelegate = new UpdateUIDelegate(ShowLines);
this.Dispatcher.Invoke(updateUIDelegate);
}
/// <summary>
/// 刷新Canvas画布线路 代码片段
/// </summary>
private void ShowLines()
{
try
{
if (Comm.x0.ToString() != "NaN")
{
Comm.theList = null;
Comm.theList = new List<LineOrientation>();
Comm.dtline = ConstDAL.linedal.GetAllLines().Tables[0];
foreach (DataRow row in Comm.dtline.Rows)
{
//……
//部分代码略
//……
Line line = new Line
line.X1 = num;
line.Y1 = num2;
line.X2 = num3;
line.Y2 = num4;
line.ToolTip = toolTip;
line.ContextMenu = lineRightMenu;
line.Tag = text + "," + num5 + "," + num6 + "," + text3;
//cv_map为XAML中定义的Canvas
cv_map.Children.Add(line);
cv_map.RegisterName(line.Name, line);
bool flag2 = text == "L5";
line = null;
}
}
}
catch (Exception ex)
{
System.Windows.MessageBox.Show("地图路线错误:" + ex.ToString());
}
}