winform防止界面卡死的三种方法
在编程过程中经常会遇到耗时操作,这个时候如果不采取一些必要的异步操作,就会导致界面的卡死,这里以winform为例子,介绍三种方法防止界面卡死,对这几个方法稍加修改同样适用于wpf,silverlight等程序
首先给出一个函数模拟耗时操作
1使用委托+QueueUserWorkItem
delegate void ChangeInvoke(int num) ;
private void ChangeNum(int num)
{
MessageBox.Show(num.ToString());
}
private void DoSomeThing(object state)
{
int i=0;
for (int i = 0; i < int.MaxValue-1; i++)
{
i++;
}
ChangeInvoke change = new ChangeInvoke(ChangeNum);
this.Invoke(change,new object[]{i});
}
以下是通过QueueUserWorkItem异步调用
ThreadPool.QueueUserWorkItem(DoSomeThing);
其实很简单,也就是一句代码的事。
2使用Task
首先还是模拟耗时操作
private int TaskTest(int num,CancellationToken token) {
// num = 0;
for (int i = 0; i < int.MaxValue-10; i++)
{
token.ThrowIfCancellationRequested();
num++;
}
return num;
}
这个耗时操作因为添加了CancellationToken,因而支持取消
接着定义耗时操作完成之后的操作
private void ShowResult(Task<Int32> t)
{
try
{
MessageBox.Show(t.Result.ToString());
}
catch(AggregateException ex)
{
MessageBox.Show("操作中断!");
}
}
最后是利用进行异步操作
Task<Int32> task = new Task<Int32>(n=>TaskTest(10,cancelSource.Token),0);
task.Start();
Task tsk = task.ContinueWith(t => ShowResult(t));
如此程序将会在耗时操作结束是调用ShowResult函数
以上两种方法使用到Task 和QueueUserWorkItem,因为之前已经有写过文章详细的介绍过,这里就不细说了,有兴趣的可以翻阅本人的前几篇文章,有做比较详细的介绍。
3利用APM进行异步调用
依然是耗时操作
private int DoSomeThing(int num)
{
for (int i = 0; i < int.MaxValue - 10; i++)
{
num++;
}
return num;
}
下面是耗时操作结束后的操作
private void APMDone(IAsyncResult result)
{
var sumDelegate = (Func<int, int>)result.AsyncState;
try
{
int sumResult = sumDelegate.EndInvoke(result);
MessageBox.Show(sumResult.ToString());
}
catch(Exception e)
{
MessageBox.Show(e.Message);
}
}
最后是调用的方法
Func<int, int> SumDelegate = TaskTest2;
SumDelegate.BeginInvoke(0, APMDone, SumDelegate);
---------------------
作者:小敏哥
来源:CSDN
原文:https://blog.csdn.net/handsomexiaominge/article/details/42653647
版权声明:本文为博主原创文章,转载请附上博文链接!
winform防止界面卡死的三种方法的更多相关文章
- C#在Winform中改变Textbox高度三种方法
最近在做C# Winform项目,需要有一个能动态调整大小的Textbox,并且要是单行的.试了几次,单行模式的Textbox不能直接改高度.于是搜索了一下,整理出几个改变高度的方法. 1.将Text ...
- 转载:WinForm中播放声音的三种方法
转载:WinForm中播放声音的三种方法 金刚 winForm 播放声音 本文是转载的文章.原文出处:http://blog.csdn.net/jijunwu/article/details/4753 ...
- 【转】c# Image获得图片路径的三种方法 winform
代码如下:c# pictureBox1.Image的获得图片路径的三种方法 winform 1.绝对路径:this.pictureBox2.Image=Image.FromFile("D:\ ...
- c# pictureBox1.Image的获得图片路径的三种方法 winform
代码如下:c# pictureBox1.Image的获得图片路径的三种方法 winform 1.绝对路径:this.pictureBox2.Image=Image.FromFile("D:\ ...
- YbSoftwareFactory 代码生成插件【二十五】:Razor视图中以全局方式调用后台方法输出页面代码的三种方法
上一篇介绍了 MVC中实现动态自定义路由 的实现,本篇将介绍Razor视图中以全局方式调用后台方法输出页面代码的三种方法. 框架最新的升级实现了一个页面部件功能,其实就是通过后台方法查询数据库内容,把 ...
- MyEclipse安装插件的三种方法和使用心得
本文讲解MyEclipse(MyEclipse10)的三种方法,以TestNG为例 Eclipse update site URL: http://beust.com/eclipse. 一.通过My ...
- 【转】asp.net导出数据到Excel的三种方法
来源:http://www.cnblogs.com/lishengpeng1982/archive/2008/04/03/1135490.html 原文出处:http://blog.csdn.net/ ...
- iis 重启 (三种方法)
iis 重启 (三种方法) WINDOWS提供WEB服务的IIS有时候会出现访问过大导致网站打不开,这时重启IIS是最好的选择. 方法/步骤 1 1.界面操作 打开“控制面板”->“管理工具”- ...
- #IOS-navigation中左滑pop的三种方法
IOS-navigation中左滑pop的三种方法 系统自带pop方法 如果我们没有对navigation中的back按钮进行自定义,我们可以直接使用系统自带的左滑pop方法.但是如果我们对back按 ...
随机推荐
- TVirtualStringTree的Minimal例子学习
预步骤第一步,定义数据结构type PMyRec = ^TMyRec; TMyRec = record Caption: WideString; end;预步骤第二步,规定取得节点数据时候的大小pro ...
- ES5中的类与继承
最近在重新复习TypeScript,看到类这块的时候自然会和ES5中的类写法进行对比加深印象. 发现ES5的类与继承一些细节还是挺多的,时间久了容易忘记,特此记录下. 首先是ES5的类定义,这没什么好 ...
- php总结6——自定义函数、引用传值
6.1 自定义函数 function 函数名称(参数[=默认值],参数[=默认值]...){ 函数体 [return val]; } 1) 无参数无返回 2) 有参数无返回 3) 有参数有返回 函数中 ...
- Android Weekly Notes Issue #275
Android Weekly Issue #275 September 17, 2017 Android Weekly Issue #275 本期内容包括给Google Map实现一个Marker A ...
- oracle数据库如何备份一张表
--用户名:tms--创建表ts_dictionary的备份create table ts_dictionary_20160715 as select * from ts_dictionary; 补充 ...
- BZOJ 3251 树上三角形:LCA【构成三角形的结论】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3251 题意: 给你一棵树,n个节点,每个点的权值为w[i]. 接下来有m个形如(p,a,b ...
- Struts2 输入校验 第四弹
ActionSupport 里面有一个validate.可以重写里面你的方法. 校验执行流程: 1)首先进行类型转化 2)然后进行输入校验(执行validate方法) 3)如果在上述过程中出现了任何错 ...
- IDEAL葵花宝典:java代码开发规范插件 p3c
前言: P3C插件 是阿里巴巴p3c项目组进行研发.这个项目组是阿里巴巴开发爱好者自发组织形成的虚拟项目组,根据<阿里巴巴Java开发规范>转化而成的自动化插件,并且实现了部分自动编程. ...
- Go丨语言学习笔记--switch
Java语言与Go语言的switch对比 Go语言 switch str { case "yes" : do something ... case "no" d ...
- kubectl工具管理应用生命周期
######kubectl管理工具###### [root@k8s-master dashboard]# kubectl get pod NAME READY STATUS RESTARTS AGE ...