调用线程无法访问此对象,因为另一个线程拥有它.WPF

Yas*_*ser 22 .net c# wpf multithreading dispatcher

每当我刷新标签时,我都会收到此错误: 调用线程无法访问此对象,因为另一个线程拥有它.我试图调用,但它失败了.我正在使用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;
    }
Run Code Online (Sandbox Code Playgroud)

Hab*_*bib 40

使用Dispatcher.Invoke方法.

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

在WPF中,只有创建DispatcherObject的线程才能访问该对象.例如,从主UI线程分离出来后台线程无法更新在UI线程上创建的Button的内容.为了让后台线程访问Button的Content属性,后台线程必须将工作委托给与UI线程关联的Dispatcher.这是通过使用Invoke或BeginInvoke来完成的.Invoke是同步的,Be​​ginInvoke是异步的.该操作将添加到指定DispatcherPriority的Dispatcher的事件队列中.

您收到错误是因为您的标签是在UI线程上创建的,并且您正在尝试通过另一个线程修改其内容.这是您需要Dispatcher.Invoke的地方.

看看这篇文章 WPF Threads使用Dispatcher构建更多响应式应用程序


gau*_*rma 17

您可以使用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");
        }
    }
));
Run Code Online (Sandbox Code Playgroud)


Til*_*lak 11

使用Dispatcher.Invoke

    void modi()
    {
        if(!Dispatcher.CheckAccess())
        {
            Dispatcher.Invoke(
                    ()=>label1.Content = "df",DispatcherPriority.Normal);
        }
        else
        {
            label1.Content = "df";
        }
    }
Run Code Online (Sandbox Code Playgroud)