C# Winform 窗体界面”假死”后台线程阻塞 解决办法–BeginInvoke
原文:C# Winform 窗体界面”假死”后台线程阻塞 解决办法–BeginInvoke
这个方法可以用在任何后台任务耗时较长,造成界面“假死”界面控件不更新的情况。
比如要要执行的数据库操作是几十万条的update语句,如果在click事件里阻塞或者做Thread.Sleep或一个耗时很长的操作,窗口就会无响应点不动了。故需要用this.BeginInvoke方法来异步执行UI线程的操作,更新界面显示。
//导入按钮点击事件
private void btn_import_Click(object sender,EventArgs e)
{
//1.绑定需要执行的操作方法
var act = new Action(Import);
act.BeginInvoke(ar => act.EndInvoke(ar), null); //参数null可以作为回调函数的返回参数
}
//回调函数(此处为无返回值函数,也可自行改写)
private void Import()
{
this.btn_import.Enable = false;
this.btn_import.Text = "正在导入...";
DateTime starttime = System.DateTime.now;
try
{
//2.执行导入数据库操作
//如:sqlhelper.ExecuteNonQuerySqlByTransation(sqlstr);
//3.执行异步操作
this.BeginInvoke(new Action(() =>
{
DateTime endtime = System.DateTime.now;
TimeSpan = ts = endtime.Subtract(starttime);
this.txt_result.Text = "导入了 " + successcount + " 条记录。";
this.lb_time.Text = "一共消耗了 " + (int)ts.TotalMinutes + " 分钟, " + ts.Seconds + " 秒。";
this.btn_import.Enable = true;
this.btn_import.Text = "点击开始导入";
}));
}
catch(Exception e)
{ }
原文链接: http://www.91w.net/codesnippet/339.html
C# Winform 窗体界面”假死”后台线程阻塞 解决办法–BeginInvoke的更多相关文章
- WinForm查询大数据界面假死,使用异步调用解决
用DataGridView无分页绑定一个几千条数据的查询,查询的时候界面直接卡死十几秒,用户体验非常不好,因此用异步操作解决界面卡死的问题原本场景:点击[查询]后,界面直接卡死优化场景:点击[查询]后 ...
- WinForm程序界面假死,寻求完美解决方案
故事的开端是这样的,小白是一个程序员,他确实也是一个小白,目前还在程序员发展的道路上,兢兢业业的小心求学. 有一天,小白接到一个任务,完成一个Winform程序,附加一个功能就是可以读IC卡. 小白终 ...
- C#中异步及winform中界面假死
c#中可以用BeginInvoke去启动异步调用,但是有两个BeginInvoke一个是controller的BeginInvoke还有一个是委托的BeginInvoke. 主要区别是controll ...
- winform窗体继承泛型类时,设计器无法使用解决办法
当我们使用winform程序时,winform窗体程序和控件程序都是可以通过设计器进行控件拖拽的,但如果我们继承了一个带有泛型的form基类.那么设计器是无法使用的. 目前我没有找到根本解决的办法,但 ...
- Qt多线程和GUI界面假死(run()是线程的入口,就像main()对于应用程序的作用。分析QThread::exec函数的源码,旧的QMutexLocker模式其实很好用,挡住别人进入抢占资源,可照抄)good
QThread的常见特性: run()是线程的入口,就像main()对于应用程序的作用.QThread中对run()的默认实现调用了exec(),从而创建一个QEventLoop对象,由其处理该线程事 ...
- PHPCMS后台密码忘记解决办法
什么是PHPCMS? PHPCMS是一款网站管理软件.该软件采用模块化开发,支持多种分类方式,使用它可方便实现个性化网站的设计.开发与维护.它支持众多的程序组合,可轻松实现网站平台迁移,并可广泛满足各 ...
- 使用publisher模式控制频繁的UI输出,避免Winform界面假死
http://www.cnblogs.com/Charltsing/p/publisher.html 最近测试task并发任务的效率与线程池的区别,发现了另外一个问题.task建立任务的速度很快,输出 ...
- 解决c# progressBar更新出现界面假死
最近一个项目需求中的一个功能是需要用progressBar反映处理文件的进度. 研究了Invoke和BeginInvoke方法. Control.Invoke 方法 (Delegate) :在拥有此控 ...
- winform调用webservice假死怎么解决
主线程调用外部web service,没有返回时,主线程阻塞了,界面肯定假死耗时操作都是要在工作线程里面执行的.一般情况下winform调用webservice时步骤1添加服务引用---高级----添 ...
随机推荐
- c++ sizeof的实现
c++中的sizeof,可以通过以下宏定义实现. #include <stdio.h> #define sizeof_T(T) ((size_t)((T*)0+1)) ///求类型的大小 ...
- 10java进阶——IO2
1. Properties类 Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串. 特点: Hashtable的子 ...
- BZOJ3129/洛谷P3301方程(SDOI2013)容斥原理+扩展Lucas定理
题意:给定方程x1+x2+....xn=m,每个x是正整数.但是对前n1个数做了限制x1<=a1,x2<=a2...xn1<=an1,同时对第n1+1到n1+n2个数也做了限制xn1 ...
- $LCT$维护子树信息学习笔记
\(LCT\)维护子树信息学习笔记 昨天\(FDF\)好题分享投了 \([ZJOI2018]\)历史 这题. 然后我顺势学学这个姿势. 结果调了一年...于是写个笔记记录一下. 基本原理 比较显然地, ...
- MyBatis体系学习总览
MyBatis特点:MyBatis是面向SQL的,核心是SQL结果和Map的映射.不要求一定与实体对象进行映射. MyBatis 可以使用 XML 或注解进行配置和映射, MyBatis 通过将参数映 ...
- Java中的Overload和Override有什么区别
Overload和Override的区别 1.Overload 定义 Overload是重载的意思.它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后在调用时,虚拟机就会 ...
- selenium 自动化的坑(1)
UI自动化,一天一坑系列(1) 不要试图自作聪明添加一些不必要的东西. 个人遇到的问题关于下拉框的,本来一个下拉框连续点击两次就好了,结果自己多余将谷歌的提示‘正在受到自动化控制’去掉了,导致原本很简 ...
- Centos添加硬盘分区
1. 查看硬盘信息 fdish -l 此处/dev/sdb为新添加硬盘 2. 格式化为ext4硬盘格式 mkfs.ext4 /dev/sdb 亦可使用其他格式 硬盘空间大于2T时,MBR分区无法识别更 ...
- linux运维、架构之路-数据库迁移
一.wordpress搭建 1.wordpress下载部署 cd /server/tools/ wget https://cn.wordpress.org/wordpress-4.8.1-zh_CN. ...
- linux nginx管理
1.添加 Nginx 服务 vim /lib/systemd/system/nginx.service 添加如下内容: [Unit]Description=nginxAfter=network.tar ...