来自后台工作人员时创建新窗口

时间:2012-01-24 18:31:30

标签: c# wpf user-interface backgroundworker

我不认为我已经找到了我正在寻找的东西,并且不确定是否可能......我已经与后台工作人员一起工作以及在某些“ProgressChanged”事件期间从后台提取消息工人并更新给定的窗口对话框。没问题。

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

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

2 个答案:

答案 0 :(得分:1)

您能否展示CurrentWindowCheckProgress的内容?我不确定在向用户显示窗口时如何阻止BackgroundWorker工作。如果您尝试在非UI线程上执行一些UI代码,则会出现错误。如果是这种情况,请尝试使用Dispatcher.Invoke(...)方法调用此代码。

答案 1 :(得分:0)

这不是背景工作者的目的。 BGW为您做的消息传递是完全异步的。从技术上讲,使用Control.Invoke在UI线程上运行代码是可行的,但可能是因为它可能具有不同的消息优先级而导致此Invoke调用与您的进度更新无序运行。

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