线程错误: 当前线程无法访问此对象,因为该对象归另一个线程所有。WPF

9 浏览
0 Comments

线程错误: 当前线程无法访问此对象,因为该对象归另一个线程所有。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日
0
0 Comments

你可以使用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");
        }
    }
));

0
0 Comments

使用Dispatcher.Invoke方法。

在关联了Dispatcher的线程上同步执行指定的委托。

另外

在WPF中,只有创建DispatcherObject的线程可以访问该对象。例如,从主UI线程分离出的后台线程无法更新在UI线程上创建的按钮的内容。为了使后台线程访问按钮的Content属性,后台线程必须将工作委托给与UI线程关联的Dispatcher。这可以通过使用Invoke或BeginInvoke来实现。Invoke是同步的,而BeginInvoke是异步的。操作将添加到具有指定DispatcherPriority的Dispatcher的事件队列中。

由于标签是在UI线程上创建的,您正在尝试通过另一个线程修改其内容,因此出现错误。这就是需要使用Dispatcher.Invoke的地方。

查看此文章:WPF线程:使用Dispatcher构建更加敏捷的应用程序

0