前言

比如如下代码

private void Form1_Load(object sender, EventArgs e)
{
Thread thread = new Thread(Test);
thread.IsBackground = true;
thread.Start();
}
private void Test()
{
Form2 form2 = new Form2();
form2.ShowDialog();
}

form2的ShowDialog()显示并不是模式窗体,如何解决这种情况???

解决方案

线程中ShowDialog的owner会变成null,需要重新指定

Form2 form2 = new Form2();
form2.ShowDialog(this);

直接上面那样调用会出现问题,从不是创建某个控件的线程的其他线程调用该控件是不安全的,
非UI线程访问控件需要使用委托。

对 Windows 窗体控件进行线程安全调用,查询控件的 InvokeRequired 属性。

  1. 如果 InvokeRequired 返回 true,则使用实际调用控件的委托来调用 Invoke。
  2. 如果 InvokeRequired 返回 false,则直接调用控件。

Form2增加xShowDialog成员函数,如下

public delegate DialogResult InvokeDelegate(Form parent);
public DialogResult xShowDialog(Form parent)
{
if (parent.InvokeRequired)
{
InvokeDelegate xShow = new InvokeDelegate(xShowDialog);
parent.Invoke(xShow, new object[] { parent });
return DialogResult;
}
return this.ShowDialog(parent);
}

在Form1类中这样调用:

Form2 form2 = new Form2();
form2.xShowDialog(this);

出处:https://blog.csdn.net/achenyuan/article/details/86597538

====================================================================

根据上面的思路,我自己写了一个ShowDialogX的方法,利用系统提供的Action或者Func实现方法的返回值,代码如下:

        public DialogResult ShowDialogX(Form parent)
{
if (parent.InvokeRequired)
{
return (DialogResult)parent.Invoke(new Func<Form, DialogResult>(delegate { return ShowDialogX(parent); }), new object[] { parent });
}
return this.ShowDialog(parent);
}

winform 多线程中ShowDialog()无效的解决办法的更多相关文章

  1. winform 多线程中ShowDialog()步骤无效的解决办法

    private void Form1_Load(object sender, EventArgs e) { Thread thread = new Thread(remind); thread.IsB ...

  2. deducmsV5.7 在{dede:datalist}标签中runphp无效的解决办法

    问题: 后台数据是dede:datalist标签展示中,中间有isshow - 是否展示的字段,数据库里存的是0/1:我本来想用{dede:field.isshow runphp='yes'}来着,可 ...

  3. 解析php file_exists无效的解决办法

    php中file_exists无效的解决办法. 方法1 :据官方手册上描述若php教程的safe mode相关的设置过于苛刻,就会出现这样的情形:尽管文件真实存在也被误报,认为文件不存在. 由于服务器 ...

  4. Pycharm中不支持中文编码的解决方案。Pycharm中文报错。 Pycharm出现的部分快捷键无效及解决办法

    Pycharm中不支持中文编码的解决方案.Pycharm中文报错. 1. 打开Pycharm ---->  File ----> Default setting ------> Ed ...

  5. Android layout_margin 无效的解决办法

    http://www.aichengxu.com/view/31025 1.如果LinearLayout中使用Android:layout_marginRight不起作用,通过测试原来在android ...

  6. 360或者金山毒霸可能会导致HP网络打印机驱动安装失败“数据无效”的解决办法

    360或者金山毒霸可能会导致HP网络打印机驱动安装失败“数据无效”的解决办法     同事办公室的打印机是网线接口的那种网络打印机,不是直接连到电脑的那种,他电脑安装了360和金山毒霸,WIN10下安 ...

  7. Vue微信自定义分享时安卓系统config:ok,ios系统config:invalid signature签名错误,或者安卓和ios二次分享时均config:ok但是分享无效的解决办法

    简述需求:要求指定页面可以进行微信自定义分享(自定义标题,描述,图片,链接),剩下的页面隐藏所有基础接口.二次分享依然可以正常使用,切换至其他页面也可以正常进行自定义分享. 这两天在做微信自定义分享的 ...

  8. eclipse配置Tomcat和Tomcat出现无效端口解决办法

    一.eclipse配置Tomcat 1. 按图选择window-preferences 2在server处选择runtime environment . 3.点击右侧add,选择自己的Tomcat版本 ...

  9. vsftp在REDHAT,CENTOS 5中登录慢的解决办法

    vsftp在REDHAT,CENTOS 5中登录慢的解决办法 vsftp在REDHAT,CENTOS 5中不仅登录慢,至少花30秒左右,而且上传文件的速度也受影响, 经过摸索,根本原因在DNS解析上花 ...

随机推荐

  1. 十六 web爬虫讲解2—PhantomJS虚拟浏览器+selenium模块操作PhantomJS

    PhantomJS虚拟浏览器 phantomjs 是一个基于js的webkit内核无头浏览器 也就是没有显示界面的浏览器,利用这个软件,可以获取到网址js加载的任何信息,也就是可以获取浏览器异步加载的 ...

  2. python进行linux系统监控

      python进行linux系统监控 Linux系统下: 静态指标信息: 名称 描述 单位 所在文件 mem_total 内存总容量 KB /proc/meminfo disks 磁盘相关信息 - ...

  3. cookie和localstorage sessionStorage的概念、区别、使用场景

    本文分为三大板块: 1 webStorage的概念 2 cookie/localStorage/sessionStorage的介绍 3 三者之间的共同点和区别 **所有代码引用均来自 作者:OBKor ...

  4. navicat for mysql 导入SQL Server显示中文乱码解决办法

    解决方法是在navicat里右击一个连接,选择连接属性,切换到高级选项卡,去掉“使用mysql字符集”前的对勾,在编码里选择utf-8

  5. java程序设计基础篇 复习笔记 第一单元

    java语言程序设计基础篇笔记1. 几种有名的语言COBOL:商业应用FORTRAN:数学运算BASIC:易学易用Visual Basic,Delphi:图形用户界面C:汇编语言的强大功能和易学性,可 ...

  6. HDU 4549 M斐波那契数列(矩阵快速幂+费马小定理)

    M斐波那契数列 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submi ...

  7. SpringAnnotation之配置AnnotationXML文件

    配置Annotation的环境:只需修改applicationContext.xml文件即可 1 2 3 4 5 6 7 8 9 10 11 <?xml version="1.0&qu ...

  8. web服务器无法显示font-awesome字体图标

    今天遇到了在本地运行网页 一切调用的额font的小图标都OK的,但是把网页发布到tomcat服务器上面就不行了 之后百度了下,找到了解决方法,遂记录下,方法如下: 在web.xml 文件中加上: &l ...

  9. Vim技能修炼教程(10) - 代码跳转

    程序员功能 前面我们用了5讲的篇幅来讲基本编辑的基本功:第4讲是基本操作,第5讲是操作符,第6讲行编辑ex命令,第7讲可视模式,第8讲多窗口,第9讲缓冲区和标签页. 从这一讲开始,我们从通用功能向程序 ...

  10. 显卡、显卡驱动、显存、GPU、CUDA、cuDNN

    显卡 Video card,Graphics card,又叫显示接口卡,是一个硬件概念(相似的还有网卡),执行计算机到显示设备的数模信号转换任务,安装在计算机的主板上,将计算机的数字信号转换成模拟 ...