winform 多线程中ShowDialog()无效的解决办法
前言
比如如下代码
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 属性。
- 如果 InvokeRequired 返回 true,则使用实际调用控件的委托来调用 Invoke。
- 如果 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()无效的解决办法的更多相关文章
- winform 多线程中ShowDialog()步骤无效的解决办法
private void Form1_Load(object sender, EventArgs e) { Thread thread = new Thread(remind); thread.IsB ...
- deducmsV5.7 在{dede:datalist}标签中runphp无效的解决办法
问题: 后台数据是dede:datalist标签展示中,中间有isshow - 是否展示的字段,数据库里存的是0/1:我本来想用{dede:field.isshow runphp='yes'}来着,可 ...
- 解析php file_exists无效的解决办法
php中file_exists无效的解决办法. 方法1 :据官方手册上描述若php教程的safe mode相关的设置过于苛刻,就会出现这样的情形:尽管文件真实存在也被误报,认为文件不存在. 由于服务器 ...
- Pycharm中不支持中文编码的解决方案。Pycharm中文报错。 Pycharm出现的部分快捷键无效及解决办法
Pycharm中不支持中文编码的解决方案.Pycharm中文报错. 1. 打开Pycharm ----> File ----> Default setting ------> Ed ...
- Android layout_margin 无效的解决办法
http://www.aichengxu.com/view/31025 1.如果LinearLayout中使用Android:layout_marginRight不起作用,通过测试原来在android ...
- 360或者金山毒霸可能会导致HP网络打印机驱动安装失败“数据无效”的解决办法
360或者金山毒霸可能会导致HP网络打印机驱动安装失败“数据无效”的解决办法 同事办公室的打印机是网线接口的那种网络打印机,不是直接连到电脑的那种,他电脑安装了360和金山毒霸,WIN10下安 ...
- Vue微信自定义分享时安卓系统config:ok,ios系统config:invalid signature签名错误,或者安卓和ios二次分享时均config:ok但是分享无效的解决办法
简述需求:要求指定页面可以进行微信自定义分享(自定义标题,描述,图片,链接),剩下的页面隐藏所有基础接口.二次分享依然可以正常使用,切换至其他页面也可以正常进行自定义分享. 这两天在做微信自定义分享的 ...
- eclipse配置Tomcat和Tomcat出现无效端口解决办法
一.eclipse配置Tomcat 1. 按图选择window-preferences 2在server处选择runtime environment . 3.点击右侧add,选择自己的Tomcat版本 ...
- vsftp在REDHAT,CENTOS 5中登录慢的解决办法
vsftp在REDHAT,CENTOS 5中登录慢的解决办法 vsftp在REDHAT,CENTOS 5中不仅登录慢,至少花30秒左右,而且上传文件的速度也受影响, 经过摸索,根本原因在DNS解析上花 ...
随机推荐
- Postman的安装
打开chrome->设置->扩展程序->获取更多扩张程序:输入 postman就可以安装了 可能需要蓝灯FQ 安装好了直接打开即可使用
- python脚本6_打印菱形
#输入菱形最宽的行所在的行数,打印菱形 m = int(input(">>>")) for n in range(m): print(" "* ...
- eclipse安装插件:
eclipse安装插件:jre跟eclipse的bit数必须匹配,即必须都是32or64位的 历史版本不好找,pydev的历史版本在sourceforge中很隐蔽,得在项目的activite中查找,另 ...
- 为什么是link-visited-hover-active
前言 通常我们在设置链接的一些伪类(link,visited,hover,active)样式时,要让不同的状态显示正确的样式,我们需要按一定的顺序设置这些伪类的样式.这里我就按CSS2规范中推荐的顺序 ...
- laravel5.5种的Eloquent ORM的使用:
控制器方法: //Eloquent ORM的使用: public function orm1() { //all() /*$students=Student::all(); dd($students) ...
- Nginx+keepalived 脚本安装主从双机热备自动切换解决方案
Nginx+keepalived 脚本安装主从双机热备自动切换解决方案 2013-07-02 19:24:13 标签:filesnginx keepalived 原创作品,允许转载,转载时请务必以超链 ...
- 不能在具有唯一索引“IX_******”的对象“dbo.****”中插入重复键的行。重复键值为 (110, 372000, 2)。
当尝试插入数据,或者更新某个表的时候出现 不能在具有唯一索引“IX_******”的对象“dbo.****”中插入重复键的行.重复键值为 (110, 372000, 2). 遇到这个问题的时候,请找到 ...
- New Concept English there (4)
20w/m These days, people who do manual work often receive far more money than people who work in off ...
- html dom SetInterVal()
HTML DOM setInterval() 方法 HTML DOM Window 对象 定义和用法 setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInt ...
- vs 添加第三方库lib的两种方法
方法一1.代码: 方法二2.配置: 首先包含头文件 #include “../DuiLib/UIlib.h” 连接器->常规-->附加库目录.即是将lib所在的目录,千万要记得,还要写一处 ...