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解析上花 ...
随机推荐
- linux---进程,(rpm,yum)软件包
3) 为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1个逻辑分区,大小为5G fdisk -l fdisk /dev/sdb p 查看 n 新建 p 主分区 ...
- grunt-init 默认模板目录更正
grunt-init是依赖grunt项目管理的脚手架工具,各种优点无须赘述,默认的template路径的作用:可以把自定义或其他模板放置其中,应用的时候直接调用模板名,不用每次寻找路径: 在安装gru ...
- [Eclipse]Eclipse快捷键
查看一个方法被谁调用:选中方法名字,Search-->Reference-->Workspace
- 【javascript基础】 JavaScript defer和async区别
defer该属性用来通知浏览器,这段脚本代码将不会产生任何文档内容.例如 JavaScript代码中的document.write()方法将不会骑作用,浏览器遇到这样的代码将会忽略,并继续执行后面的代 ...
- win10下安装VS2005运行程序出现0x000007b错误的解决方法
项目工程一运行就报错...真心坑... 方法如下: 1.安装DirectX 9.0c 形成原因是因为DirectX 9.0被损坏, 只需要安装即可. 如果有电脑管家的.在电脑管家里面搜索“Direct ...
- 词频统计 ——Java
github地址 :https://github.com/NSDie/personal-project 一.计划表 PSP2.1 Personal Software Process Stages 预估 ...
- L159
Waves are the children of the struggle between ocean and atmosphere, the ongoing signatures of infin ...
- PostgreSQL CheckPoint设置(转)
今天在研究checkpoint process的问题时,顺便复习了一下checkpoint设置问题,又有新的疑惑了. checkpoint又名检查点,在oracle中checkpoint的发生意味着之 ...
- 两个init方法的区别
容器创建了Servlet实例后,它将调用实例的init(ServletConfig)方法初始化Servlet.该方法的参数ServletConfig对象包含了在WEB应用程序的部署描述文件中指定的初始 ...
- vscode+Firefox实现前端移动真机测试
需要配件: 1.安装有火狐浏览器的移动端(手机); 2.安装有火狐浏览器和vscode的pc(电脑); 3.在vscode安装Live Server 插件 4.安装之后vscode右下角会有Go Li ...