将控件添加到 BackgroundWorker 中的 StackPanel 或从另一个 BackgroundWorker 调用的异步任务
Add controls to a StackPanel in a BackgroundWorker or async Task called from another BackgroundWorker
我正在编写一个 IRC 客户端,使用 Meebey SmartIrc4Net。
通过使用 BackgroundWorker,我通过 class 提供的 .Listen() 方法监听所有 IRC 事件。
有一个我用方法处理的 OnJoin 事件,此方法通过生成另一个 BackgroundWorker 并轮询其中的数据来获取频道的用户列表。
所以现在我有一个主线程,一个据我所知是主线程的子线程的 irc 事件 bgWorker,以及一个用户列表 bgWorker。
问题是我无法在任何 bgWorkers 中创建 UI 元素,例如,如果我想将按钮添加到 StackPanel,我无法在 bgWorkers 工作方法中声明按钮,或者即使我使用 reportProgress 方法,因为它似乎是向第一个 bgWorker 而不是向主线程报告。
The calling thread must be STA, because many UI components require this.
自从我的应用程序使用 .Net Framework 4.5 以来,我使用了 bgWorkers 和 async/await 和任务,但都无济于事。
这与最常见的情况不同,在这种情况下,您将控件从 bgWorker 添加到主线程,我有三个线程,我正在尝试从主线程的子线程的子线程添加控件,并且建议的解决方案仅在存在单个 bgWorker 和主线程时有用。
提前致谢。
您不能从除 UI 线程之外的任何线程创建控件。
运行 UI 线程上的代码你可以使用 Dispatcher.BeginInvoke,你可以在任何 UI 元素上找到调度程序(在 Dispatcher 属性) 或在启动后台进程之前使用来自 UI 线程的 statis Dispatcher.CurrentDispatcher 属性。
我正在编写一个 IRC 客户端,使用 Meebey SmartIrc4Net。
通过使用 BackgroundWorker,我通过 class 提供的 .Listen() 方法监听所有 IRC 事件。
有一个我用方法处理的 OnJoin 事件,此方法通过生成另一个 BackgroundWorker 并轮询其中的数据来获取频道的用户列表。
所以现在我有一个主线程,一个据我所知是主线程的子线程的 irc 事件 bgWorker,以及一个用户列表 bgWorker。
问题是我无法在任何 bgWorkers 中创建 UI 元素,例如,如果我想将按钮添加到 StackPanel,我无法在 bgWorkers 工作方法中声明按钮,或者即使我使用 reportProgress 方法,因为它似乎是向第一个 bgWorker 而不是向主线程报告。
The calling thread must be STA, because many UI components require this.
自从我的应用程序使用 .Net Framework 4.5 以来,我使用了 bgWorkers 和 async/await 和任务,但都无济于事。
这与最常见的情况不同,在这种情况下,您将控件从 bgWorker 添加到主线程,我有三个线程,我正在尝试从主线程的子线程的子线程添加控件,并且建议的解决方案仅在存在单个 bgWorker 和主线程时有用。
提前致谢。
您不能从除 UI 线程之外的任何线程创建控件。
运行 UI 线程上的代码你可以使用 Dispatcher.BeginInvoke,你可以在任何 UI 元素上找到调度程序(在 Dispatcher 属性) 或在启动后台进程之前使用来自 UI 线程的 statis Dispatcher.CurrentDispatcher 属性。