首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在线程中打开新的子窗体

在线程中打开新的子窗体
EN

Stack Overflow用户
提问于 2013-07-09 16:32:08
回答 1查看 147关注 0票数 2

当线程退出时,我正在尝试打开新的子窗体(BuyNow窗体),并且我确定许可证类型已过期。在线程期间,我打开一个新进程,该进程执行许可证计算并将信息发送回主进程。问题是,线程在收到所有信息之前就退出了,所以我无法打开BuyNow表单,因为它还不知道许可证已经过期。

代码如下:

代码语言:javascript
复制
        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仍在线程中创建。

你们能想到什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-09 16:34:36

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17543540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档