公司的系统搭载了好多奇奇怪怪的exe,以前启动exe后,系统还能接着操作。但是后面又提出额外的需求,说是打开外部exe之后,启动exe的父界面要完全不能进行任何操作。当然按常人所想再加一句waitforexit就能决了啦,然后公司的测试超级牛逼,在exe启动的时候跑去父界面随便点了一个按钮,然后奇怪的事情就发生了:在exe关闭之后,你刚刚点击的那个按钮就会里面响应。其实最后发现不止是按钮,是整个界面都会在exe启动的过程中响应鼠标事件,但是需求要和showdialog出子界面一样的效果。虽然用户一般在exe启动的时候,也不会去乱点什么就是了,但是bug就是bug,不能不解决啊。期间想过很多办法,比如重写WndProc,比如设置flag,比如启动exe重新开线程,但是都不能很好的解决。最后受人指点如此解决了。

private void btnInvoke_Click(object sender, EventArgs e)
{
       MessageBox.Show("Hello ");
}

private void btnTest_Click(object sender, EventArgs e)
{
        this.Enabled = false;
        Thread t = new Thread(new ThreadStart(delegate
        {
             System.Diagnostics.Process exep = new System.Diagnostics.Process();
             exep.StartInfo.FileName = @"C:\Test1.exe";
             exep.EnableRaisingEvents = true;
             exep.Start();
             exep.WaitForExit();
             this.BeginInvoke(new Action(() => { this.Enabled = true; }));
        }));
        t.Start();
}

为什么会出现这种情况呢?首先启动exe的waitforexit只是将主线程(UI线程)挂起了,或者说暂时阻塞它,在exe保持启动的过程中,你对父界面进行的任何操作其实都会像排队一样被排它主线程中去,等主线程被阻塞的事情结束之后,它就会开始反应了。而且这种现象只会响应你对父界面的第一次操作,就是点一个button,在去点关闭按钮,只会响应button事件,相反,就会响应关闭事件。现在的做法是把启动exe的事情放到新的线程里面去做,不去阻塞主线程,再非活性化界面,最后用begininvoke异步执行指定的委托,在活性化界面,这样就能完全阻止那种现象的发生。不过就算如此写,waitforexit也是不能省的,之前查waitforexit是相当于挂起主线程,但是在这里把waitforexit省掉,非活性化整个界面的代码就没有用了,非活性化后面begininvoke在活性化,两部一起,等于没有做,另外省掉的话父界面就直接能操作了,所以看来waitforexit还是要搭配一起写才能实现最终效果。

最新文章

  1. c# NPOI 导出EXCEL
  2. React学习笔记---项目构建
  3. 安装docker后,VMware网络无法访问了,VMware重置网络设置
  4. 如何用distinct消除重复记录的同时又能选取多个字段值?
  5. C++Primer 第十六章
  6. C#: enum
  7. try-catch中的finally块
  8. 提取html中的src 路径
  9. hdu 4529 Double Dealing (置换群)
  10. bluetooth发展(五岁以下儿童)------蓝牙功能测试(一个)
  11. JavaScript –type
  12. chrome Web开放 字体格式不能显示问题
  13. python * 的区别
  14. 迭代与JDB
  15. mysql 存储 2
  16. 自定义注解(spring)
  17. git 命令(补充篇)的本质理解
  18. moment.js 学习笔记
  19. UINavigationController出现nested push animation can result in corrupted navigation bar的错误提示
  20. MUI框架 选择器的使用

热门文章

  1. Codeforces Round #260 (Div. 2) D
  2. [国家集训队2010]小Z的袜子
  3. Happy 2006 欧几里得定理
  4. hdu——3836 Equivalent Sets
  5. 当你买了一辆全车搭载Android操作系统的某侠电动汽车以后
  6. Asp.Net实现JS前台带箭头的流程图方法总结!(个人笔记,信息不全)
  7. Android Path路径设置,针对error opening trace file:No such file or directory
  8. hdu5371 最长回文子串变形(Manacher算法)
  9. iOS开发-植入广告(iAd, Admob实例)
  10. Android 淘宝搜索记录分析及千牛数据库名称关联