gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:11:56 24 4
gpt4 key购买 nike

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com