gpt4 book ai didi

c# - 在线程中打开一个新的子窗体

转载 作者:行者123 更新时间:2023-11-30 22:16:14 24 4
gpt4 key购买 nike

当线程退出并且我确定许可证类型已过期时,我试图打开一个新的子表单(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 仍在线程中创建。

你们能想到什么吗?

最佳答案

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

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

关于c# - 在线程中打开一个新的子窗体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17543540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com