2

当线程退出并且我确定许可证类型已过期时,我正在尝试打开一个新的子表单(BuyNow 表单)。在一个线程中,我打开一个新进程来计算许可证并将信息发送回主进程。问题是,线程在收到所有信息之前就退出了,所以我无法打开 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 仍在线程中创建。

大家有什么想不开的吗?

4

1 回答 1

3

该类Process有一个WaitForExit方法。这将等待,令人惊讶的是,直到进程退出。您必须(显然)在DoWork.

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

于 2013-07-09T08:34:36.223 回答