c# - 来自其他类的 WinForm 控件的线程安全更新

标签 c# .net winforms multithreading thread-safety

有人可以帮我解决以下问题吗:

有两个类 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/

相关文章:

c# - 相当于 If contains using SQL?

c# - 有没有办法找到与 DateTime 格式字符串匹配的第一个字符串?

c# - Resharper 将字段更改为只读

c# - WebException.Response.GetResponseStream() 应该关闭/处置吗?

c# - 更新 Oracle 12.1 到 12.2 出现 Oracle Dependency Error

c# - 在拆分富文本时保存段落格式

c# - WPF 应用程序的 Windows 任务栏中显示错误大小的图标

c# - 如何在一行代码中转换和使用一个对象?

c# - 从 Winforms ElementHost WPF UserControl 设置 WPF 对话框所有者

c# - Windows 窗体定时器