在线程中打开新的子表单

时间:2013-07-09 08:32:08

标签: c# multithreading winforms thread-safety

我正在尝试在线程退出时打开一个新的子表单(BuyNow表单),并确定要过期的许可证类型。在一个线程中,我打开一个执行许可计算的新进程,并将信息发送回Main进程。问题是,线程在收到所有信息之前退出,因此我无法打开BuyNow表单,因为它不知道许可证已过期。

这是代码:

        BackgroundWorker BW = new BackgroundWorker();
        BW.DoWork += (sender, e) =>
            {
                Process.Start("LicenseManager.exe", "-Check");
                // PSI Info, DataRecieved Event Args and etc.. included in Process.
                // Opens the process which takes about 5 second to calculate and post
                // license information. Then LicenseMode changes to TrialExpired
                // if not activated and trial expired.
            };
        BW.RunWorkerCompleted += (sender, e) =>
            {
                // This never gets executed because License is not changed to TrialExpired by the time BW is completed.
                if (LicenseMode == License.TrialExpired)
                {
                   new BuyNowForm().Show();
                }
            };
        BW.RunWorkerAsync();

我尝试在线程中打开BuyNowForm,但冻结了新创建的表单。我不想尝试Thread.Sleep并等待几秒钟让进程发送信息。 Thread.Join()似乎冻结主UI几秒钟。 Process.Exited + =也不起作用,因为进程是在一个线程中创建的,所以当它退出时,仍然会在一个线程中创建BuyNowForm。

你们有什么可以想到的吗?

1 个答案:

答案 0 :(得分:3)

Process类有WaitForExit方法。这将等待,直到进程退出。你必须(显然)在DoWork中这样做。

您不应该从另一个线程打开表单(对于DoWork也是如此)。 RunWorkerCompleted将是正确的方法,因为它在主GUI线程中执行。