有人可以帮我解决以下问题吗:
有两个类 MainForm 和 LWriter。下面是 LWriter 中的一个方法,除了写入文件之外,还向 RichTextBox 控件发送一些更新(通过 mainForm.UpdateLog(text))。一切工作正常,但是,此 WriteOutput 方法还执行一些广泛的处理,在计算期间冻结表单。
我认为 WriteOutput 应该封装在一个单独的线程中。有人可以帮我解释如何将 WriteOutput (LWriter 类)放置在一个线程中,然后以安全的方式从 mainFrom 调用 mainForm.UpdateLog() 吗?
我是线程新手,因此非常感谢您的帮助。
public void WriteOutput(string output, Links[] links)
{
try {
using (StreamWriter sw = new StreamWriter(output)) {
for (int x= 1; x<links.Length;x++) {
...
sw.WriteLine( ... );
sw.Flush();
}
mainForm.UpdateLog(<text>);
}
} catch(Exception e) { ... }
}
通常,您应该在BackgroundWorker
。定义工作方法:
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
// execute your WriteOutput method
}
并设置为DoWork
事件处理程序:
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerAsync(); // start the worker
要从不同的线程安全地更新 UI,请使用Control.BeginInvoke
method:
mainForm.BeginInvoke(
() => { mainForm.UpdateLog(<text>); });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)