在线程中打开新的子窗体
本文关键字:窗体 线程 | 更新日期: 2023-09-27 18:21:48
当线程退出并且我确定许可证类型已过期时,我正试图打开一个新的子窗体(BuyNow form)。在一个线程中,我打开一个新的进程来进行许可证计算,并将信息发送回主进程。问题是,线程在收到所有信息之前就退出了,所以我无法打开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.Join()似乎冻结了主UI几秒钟。Process.Exited+=也不起作用,因为进程是在线程中创建的,所以当它退出时,BuyNowForm仍在线程中被创建。
有什么你们能想到的吗?
Process
类有一个WaitForExit
方法。令人惊讶的是,这将一直等到进程退出。你必须(显然)在DoWork
中做到这一点。
您不应该从另一个线程打开表单(DoWork
也是如此)。RunWorkerCompleted
将是正确的方式,因为它是在主GUI线程中执行的。