后台工作者窗口控件未呈现

时间:2010-06-01 13:52:06

标签: c# .net-3.5 backgroundworker

有没有办法在不使用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

}

2 个答案:

答案 0 :(得分:0)

您可以在启动后台工作程序之前显示该对话框,并声明一个volatile var,您可以在后台工作程序中更改/检查并保持其运行,直到它具有您想要的值,这将实现对话框关闭后。

答案 1 :(得分:0)

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

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

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