c# - 从 BackgroundWorker 线程访问 UI 控件

标签 c# winforms asynchronous udp

我的 Windows 窗体上有一个调用 RunWorkerAsync() 方法的按钮,它依次执行一个操作,然后更新同一窗体上的 ListBox。

在 DoWork 事件完成后,我为事件分配结果(这是一个列表),我处理 RunWorkerCompleted() 事件,然后执行以下代码来更新我的列表框

alt text

它调用这个:

alt text

(抱歉,代码格式化不起作用)

现在,当我运行应用程序并按下刷新按钮时,出现以下异常:

alt text

我该如何解决这个问题?

编辑:

在以下语句中抛出异常,这发生在我清除内容以使列表保持最新的 DoWork 方法中;

listBoxServers.Items.Clear();

最佳答案

您不能在列表框上调用 Invoke,但可以在窗体上调用。对于 WinForms 应用程序,我使用类似的东西:

...
this.Invoke((MethodInvoker)delegate()
{
    // Do stuff on ANY control on the form.
});
...

根据 .NET 版本,您可能必须自己为 MethodInvoker 声明一个委托(delegate)

public delegate void MethodInvoker();

但是,您也可以考虑使用后台工作程序的 ReportProgress 功能。应在表单线程的上下文中调用相应的事件处理程序。

关于c# - 从 BackgroundWorker 线程访问 UI 控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4428817/

相关文章:

javascript - 如何打破 promise 的链条

angular - Angular `ngOnInit` 中的异步/等待

c# - .NET 中的透明度和 GIF——不一致的行为

c# - 如何使方法的返回类型通用?

c# - 带有边界框缩放点框的用户控件

c# - 从以编程方式创建的按钮事件调用函数

c# - 这如何与 winforms 中的文本框一起使用

c# - 简单的制表题

c# - 如何在 2 个用户之间创建唯一 ID?

iphone - 异步加载 Web 内容