作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
有人可以帮我解决以下问题吗:
有两个类 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
方法:
mainForm.BeginInvoke(
() => { mainForm.UpdateLog(<text>); });
关于c# - 来自其他类的 WinForm 控件的线程安全更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8808395/
我是一名优秀的程序员,十分优秀!