调用线程不能访问这个对象,因为它被另一个线程拥有

本文关键字:线程 因为 另一个 拥有 对象 不能 访问 调用 | 更新日期: 2023-09-27 18:18:52

我在一个。cs文件中有消息框,我想清除文本框,这是在另一个。cs文件上的ok按钮单击。我用了

System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke((Action)(() =>
{
      _upload._txtbxNotes.Text = "";
}));

用于解决线程问题,但它没有帮助我,它仍然显示相同的错误。谢谢你的帮助。


更新:

你好,我也更新了我的代码,但它没有改变文本框的值。它保持不变。我有一个线程在上传屏幕上的进度条。

下面是我的代码:fileuload .cs
            if (String.Equals(objFileUploadResponse.responseCode, 102))
            {
                //  MessageBox.Show("File Uploaded Successfully");
                ipbup.ReportProgress(qpvsChunk);
                DialogResult dialogResult = System.Windows.Forms.MessageBox.Show("File Uploaded", "", MessageBoxButtons.OK);
                if (dialogResult == DialogResult.OK)
                {
                    _upload.SetNotes(" ");                                                                               
                }
            }
            else
            {
                System.Windows.MessageBox.Show("File Uploaded Failed");
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

Upload.cs:

public void SetNotes(string note)
{
    _txtbxNotes.Dispatcher.Invoke(() =>
    {
        _txtbxNotes.Text = note;
    });
}

调用线程不能访问这个对象,因为它被另一个线程拥有

这可能是因为您正在运行另一个线程。当您在另一个线程上调用System.Windows.Threading.Dispatcher.CurrentDispatcher时,它将创建一个新的Dispatcher。但是你不想要一个新的调度程序,你想要使用"拥有"控件/窗口的Dispatcher

为了解决这个问题,你的控件/窗口有一个Dispatcher属性。(它指的是创建它的Dispatcher)

你可以试试:

// use the Dispatcher from the _upload control.
_upload._txtbxNotes.Dispatcher.Invoke(() =>
{
    _upload._txtbxNotes.Text = "";
}));

一个"更好"的方法可能是:在你的_upload类中创建一个名为(例如) _upload.SetNotes(string note);的方法,这样你就可以保持逻辑分离。今天你想要一个TextBox,明天你可能想要一个Label。这样,只有你的上传窗口/控件/类会受到影响。

// for example:  (pseudo)
_upload.SetNotes("");

class UploadWindow
{
    // ......
    public void SetNotes(string note)
    {
        _txtbxNotes.Dispatcher.Invoke(() =>
        {
            _txtbxNotes.Text = note;
        }));
    }
}
相关文章: