线程错误: 当前线程无法访问此对象,因为该对象归另一个线程所有。WPF
线程错误: 当前线程无法访问此对象,因为该对象归另一个线程所有。WPF
这个问题已经有答案了:
每当我刷新标签时,都会出现这个错误:因为不同的线程拥有它,所以调用线程无法访问此对象。我尝试了调用但失败了。我正在使用WPF表单。
delegate void lostfocs(string st); private void imgPayment_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { Thread t = new Thread(modi); t.Start(); } void modi() { try { label1.Content = "df"; } catch { lostfocs ld = new lostfocs(up); // ld.Invoke("df"); object obj=new object(); ld.Invoke("sdaf"); } } void up(string st) { label1.Content = st; }
admin 更改状态以发布 2023年5月24日
你可以使用Dispatcher来实现这个。你的代码变成...
private void imgPayment_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { Dispatcher.BeginInvoke(DispatcherPriority.Input, new ThreadStart(() => { try { label1.Content = "df"; } catch { lostfocs ld = new lostfocs(up); // ld.Invoke("df"); object obj=new object(); ld.Invoke("sdaf"); } } ));
使用Dispatcher.Invoke方法。
在关联了Dispatcher的线程上同步执行指定的委托。
另外
在WPF中,只有创建DispatcherObject的线程可以访问该对象。例如,从主UI线程分离出的后台线程无法更新在UI线程上创建的按钮的内容。为了使后台线程访问按钮的Content属性,后台线程必须将工作委托给与UI线程关联的Dispatcher。这可以通过使用Invoke或BeginInvoke来实现。Invoke是同步的,而BeginInvoke是异步的。操作将添加到具有指定DispatcherPriority的Dispatcher的事件队列中。
由于标签是在UI线程上创建的,您正在尝试通过另一个线程修改其内容,因此出现错误。这就是需要使用Dispatcher.Invoke的地方。