gpt4 book ai didi

c# - 后台 Worker 正在运行但不打印任何内容

转载 作者:太空狗 更新时间:2023-10-30 01:16:38 26 4
gpt4 key购买 nike

我有一个名为 bgwBackgroundWorker,我将名为 LogBoxForm 的自定义 Form 传递给它。自定义 Form 作业只是在上面打印一些东西。

LogBoxForm logBox = new LogBoxForm(); //both declared in the main Form
BackgroundWorker bgw = new BackgroundWorker();

在主 FormLoad event 中发起了两个 bgw 事件:DoWorkRunWorkerCompleted 像这样

bgw.DoWork += bgw_DoWork;
bgw.RunWorkerCompleted += bgw_RunWorkerCompleted;

然后当我按下名为 button9Button 时,bgw 将按照此代码的指示运行

//Background worker
BackgroundWorker bgw = new BackgroundWorker();
private void button9_Click(object sender, EventArgs e) {
if (bgw.IsBusy)
return;
bgw.RunWorkerAsync(logBox);
}

void bgw_DoWork(object sender, DoWorkEventArgs e) {
LogBoxForm lbf = e.Argument as LogBoxForm;
try {
for (int i = 0; i < 5; ++i) {
lbf.WriteTimedLogLine("loop " + (i + 1).ToString());
Thread.Sleep(1000);
}
} catch (Exception exc) {
throw exc;
}
}

void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
logBox.WriteTimedLogLine("Completed!");
if (e.Error != null)
logBox.WriteTimedLogLine(e.Error.ToString());
}

它在 catch 行停止 这是我收到的错误消息:

System.InvalidOperationException: Cross-thread operation not valid: Control 'richTextBoxAll' accessed from a thread other than the thread it was created on.

我是 BackgroundWorker 的新用户,可能真的不知道这一切是如何发生的。我希望更有经验的人可以告诉我我的代码有什么问题。期待您的指导。

最佳答案

这应该是Thread Affinity的一个经典案例。由于 BackgroundWorker 在不同于 UI 线程的线程上运行,因此您需要调用 .Invoke。查看此链接 here查看封装线程安全调用的扩展方法示例。

使用此扩展方法,您可以像这样编写 WinForms 线程安全代码:

this.ThreadSafeInvoke(() => logBox.WriteTimedLogLine("loop " + (i + 1).ToString()));

这里的关键是,由于您在不同的线程上执行,.InvokeRequired bool 值将返回 true,然后您将执行传递给 Action >ThreadSafeInvoke 通过 .Invoke -- 这将编码回 UI 线程。

如果您不想使用扩展方法,只需执行以下操作:

this.Invoke(new MethodInvoker(() => 
logBox.WriteTimedLogLine("loop " + (i + 1).ToString())));

扩展方法的优点是显而易见的。希望对您有所帮助。

关于c# - 后台 Worker 正在运行但不打印任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34655174/

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