我有一个winform应用程序(一个表单),在这个表单上有一个RichTextBox.在这个表单的构造函数中,我创建了一个类的实例MyClass
.在"Form_Load"中,我Initialisation
从MyClass
实例中调用该方法.
在表单构造函数中
myClass = new MyClass(RichTextBox richTextBox);
Run Code Online (Sandbox Code Playgroud)
在Form_Load中
myClass.Initialisation();
Run Code Online (Sandbox Code Playgroud)
在Initialisation
方法中,在循环中,我读了一些参数做其他的东西.为了不冻结应用程序(因为某些操作可能需要一段时间,几秒钟),我使用了BackgroundWorker
.我这样使用它(见下面的代码).
当我执行时,我收到此错误:跨线程操作无效:控制'richTextBox'从其创建的线程以外的线程访问.
你能告诉我怎么解决这个问题吗?当我不访问时,工作完美richTextBox
public Class MyClass
{
static BackgroundWorker _bw;
public MyClass()
{
_bw = new BackgroundWorker
{
WorkerReportsProgress = true,
WorkerSupportsCancellation = true
};
_bw.DoWork += bw_DoWork;
_bw.ProgressChanged += bw_ProgressChanged;
_bw.RunWorkerCompleted += bw_RunWorkerCompleted;
}
static void bw_DoWork(object sender, DoWorkEventArgs e)
{
foreach (....)
{
if (....)
{
richtextBox.Text.AppendText("MyText");
}
}
e.Result = true;
}
static void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){}
static void bw_ProgressChanged(object sender, ProgressChangedEventArgs e){}
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 33
使用BackgroundWorker
并不能免除正常的线程规则 - 例如只有 UI线程才能访问UI组件.
如果要从BackgroundWorker
除使用进度/完成事件(在UI线程上引发)之外的其他事件更新UI ,则需要使用Control.Invoke
/ Control.BeginInvoke
就像在其他情况下一样.例如:
if (....)
{
Action action = () => richtextBox.Text.Add("MyText");
richtextBox.Invoke(action); // Or use BeginInvoke
}
Run Code Online (Sandbox Code Playgroud)
Cha*_*mal 12
试试这段代码,
BeginInvoke((MethodInvoker)delegate
{
richtextBox.Text.Add("MyText");
});
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
26915 次 |
最近记录: |