【问题标题】:Creating new Window while coming from a background worker来自后台工作人员时创建新窗口
【发布时间】:2012-01-24 18:31:29
【问题描述】:

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

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

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

【问题讨论】:

  • 你能贴出你用来显示TestPromptWindow的代码吗?
  • 听起来确实不像您实际使用 ProgressChanged 事件。正如您所描述的那样,调用 ReportProgress() 不会阻塞 BGW 线程。您将不得不在工作人员内部使用 Dispatcher.Invoke()。

标签: c# wpf user-interface backgroundworker


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 抱歉这么晚才回复...完成任务后,我完全空白了回到这里获得信用。
    猜你喜欢
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    相关资源
    最近更新 更多