来自后台工作程序时正在创建新窗口

本文关键字:新窗口 窗口 创建 后台 工作程序 | 更新日期: 2023-09-27 18:21:30

我想我还没有完全找到我要找的东西,也不确定是否可能。。。我曾与后台工作人员一起处理流程,并在某些"ProgressChanged"事件期间从后台工作人员那里提取消息并更新给定的窗口对话框。没问题。

新建项目。。。在我试图在后台工作程序上运行的某个过程中,根据特定条件,我需要它在恢复操作之前实际调用一个新的窗口对话框以获取用户输入。。。以伪格式。。

Start Window
Click Button For Action
Create BackgroundWorker (BGW) and enable progress changed
Link BGW "ProgressChanged" to CurrentWindowCheckProgress method
run BGW process

在BGW中,在特定条件下,我会更新进度,并在BGW上标记我需要向用户显示特定的对话框X。因此,通过ReportProgress(),CurrentWindowCheckProgress方法的钩子被命中(在UI线程上)。这个方法看到了标志,需要创建一个新的Window(),从中得到答案,然后返回BGW线程继续。

到目前为止,所有的逻辑都按计划运行,但我收到了一个错误

"调用线程必须是STA,因为许多UI组件都需要它。"

那么,我需要如何/做什么来向用户显示我的临时表单"TestPromptWindow"。

这是C#、WPF、VS2010、.Net 4.0

来自后台工作程序时正在创建新窗口

您能显示CurrentWindowCheckProgress的内容吗?我不确定在向用户显示窗口时如何阻止BackgroundWorker工作。该错误看起来像是您试图在非UI线程上执行某些UI代码。如果是这种情况,请尝试使用Dispatcher.Invoke(...)方法调用这段代码。

这不是后台工作人员的设计目的。BGW为您所做的消息传递是完全异步的。从技术上讲,可以使用Control.Invoke在UI线程上运行代码,但此Invoke调用可能会随着进度更新而无序运行,因为它可能具有不同的消息优先级。

.net的下一个版本将为此提供非常好的支持。同时,您可以使用Task类,特别是它的continueWith成员。这里有一个很好的例子,展示了如何来回切换到UI线程。