调用线程不能访问这个对象,因为它被另一个线程拥有
本文关键字:线程 因为 另一个 拥有 对象 不能 访问 调用 | 更新日期: 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;
}));
}
}