【问题标题】:background worker window controls not rendered后台工作窗口控件未呈现
【发布时间】:2011-02-26 09:03:34
【问题描述】:

有什么方法可以在不使用 showdialog() 的情况下在后台工作线程中加载窗口?后台工作人员只有在从窗口获得一些输入后才会终止。这里的问题是显示了窗口,但即使我们无法控制任何窗口,按钮和其他控件也不会呈现。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{
        // acquire form
    Acquire aq = new Acquire(Handle);
        aq.Show();
        do
        {
    // waiting for image

        } while (!aq.isImageReady);      

    // doing Image operation

}

【问题讨论】:

  • 你从哪里调用 backgroundWorker 线程?
  • 同一个表单的按钮点击事件

标签: c# .net-3.5 backgroundworker


【解决方案1】:

您可以在启动后台工作程序之前显示对话框,并声明一个volatile var,您可以更改/签入后台工作程序并使其保持运行,直到它达到您想要的值,一旦对话框已关闭。

【讨论】:

  • 根据我的项目架构,在启动后台工作程序之前我无法显示对话框。
【解决方案2】:

问题可能是因为您使用后台线程而不是进程的主 UI 线程来显示窗口。如果 Winform 控件没有在正确的线程上使用,它们要么抛出异常,要么行为不正确。在这种情况下,问题可能是您的主窗口正在主 UI 线程上运行,而这个额外的对话框窗口正在由不同的线程创建和显示。

尝试从后台线程引发事件,让 UI 知道它需要用户输入。然后,UI 可以处理显示对话框并通过将数据传回后台线程来响应用户的输入。

为了防止后台线程继续进行,请创建一个 System.Threading.AutoResetEvent 对象(WaitHandle)并在引发事件后立即在该对象上调用 WaitOne 方法以通知 UI 显示对话框。当 UI 通过将数据传回后台线程来响应用户输入时,该代码可以调用 AutoResetEvent 对象的 Set 方法,从而允许后台线程继续进行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多