在编程过程中经常会遇到耗时操作,这个时候如果不采取一些必要的异步操作,就会导致界面的卡死,这里以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防止界面卡死的三种方法的更多相关文章

  1. C#在Winform中改变Textbox高度三种方法

    最近在做C# Winform项目,需要有一个能动态调整大小的Textbox,并且要是单行的.试了几次,单行模式的Textbox不能直接改高度.于是搜索了一下,整理出几个改变高度的方法. 1.将Text ...

  2. 转载:WinForm中播放声音的三种方法

    转载:WinForm中播放声音的三种方法 金刚 winForm 播放声音 本文是转载的文章.原文出处:http://blog.csdn.net/jijunwu/article/details/4753 ...

  3. 【转】c# Image获得图片路径的三种方法 winform

    代码如下:c# pictureBox1.Image的获得图片路径的三种方法 winform 1.绝对路径:this.pictureBox2.Image=Image.FromFile("D:\ ...

  4. c# pictureBox1.Image的获得图片路径的三种方法 winform

    代码如下:c# pictureBox1.Image的获得图片路径的三种方法 winform 1.绝对路径:this.pictureBox2.Image=Image.FromFile("D:\ ...

  5. YbSoftwareFactory 代码生成插件【二十五】:Razor视图中以全局方式调用后台方法输出页面代码的三种方法

    上一篇介绍了 MVC中实现动态自定义路由 的实现,本篇将介绍Razor视图中以全局方式调用后台方法输出页面代码的三种方法. 框架最新的升级实现了一个页面部件功能,其实就是通过后台方法查询数据库内容,把 ...

  6. MyEclipse安装插件的三种方法和使用心得

    本文讲解MyEclipse(MyEclipse10)的三种方法,以TestNG为例 Eclipse update site URL:  http://beust.com/eclipse. 一.通过My ...

  7. 【转】asp.net导出数据到Excel的三种方法

    来源:http://www.cnblogs.com/lishengpeng1982/archive/2008/04/03/1135490.html 原文出处:http://blog.csdn.net/ ...

  8. iis 重启 (三种方法)

    iis 重启 (三种方法) WINDOWS提供WEB服务的IIS有时候会出现访问过大导致网站打不开,这时重启IIS是最好的选择. 方法/步骤 1 1.界面操作 打开“控制面板”->“管理工具”- ...

  9. #IOS-navigation中左滑pop的三种方法

    IOS-navigation中左滑pop的三种方法 系统自带pop方法 如果我们没有对navigation中的back按钮进行自定义,我们可以直接使用系统自带的左滑pop方法.但是如果我们对back按 ...

随机推荐

  1. oracle ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

    ORA-12514: TNS:listener does not currently know of service requested in connect descriptor 1.看看是不是监听 ...

  2. Ubuntu/CentOS下使用脚本自动安装 Docker

    Ubuntu.Debian 系列安装 Docker 系统要求 Docker 支持以下版本的 Ubuntu 和 Debian 操作系统: Ubuntu Xenial 16.04 (LTS) Ubuntu ...

  3. Spring Boot2.0之多数据源事务管理

    结合前面做的小项目,如果我把test01 test02下面的 service 都加了 事务的注解 这样启动时候会报错! 事务管理器里面不能有两个事务!!!! 这时候需要用  @Transactiona ...

  4. Es6 学习笔记(一)数组扩展

    扩展运算符 ... 1.数组的扩展运算符将一个数组转换成一个逗号分隔的参数序列 console.log(...[1,2,3])   //1,2,3 ['a', 'b',...[1,3]]   //a, ...

  5. legend2---开发日志14(游戏对用户友好的设计思路)

    legend2---开发日志14(游戏对用户友好的设计思路) 一.总结 一句话总结: 不强制,但是激励:比如宗门灵力等级从强制提升到提升宗门和用户的修炼速度 1.丹药有必要做成随机数值么? 没有 1. ...

  6. 搭建LoadRunner中的场景(一) 创建场景

    一.创建场景 1. 使用场景创建设置对话框 场景分类: 1. 人工场景:相比面向目标场景,人工场景在实际工作中的应用更为广泛. 2. 面向目标场景:预先定义了一个测试目标,LoadRunner将根据这 ...

  7. ThreadPoolExecutor线程池进阶使用

    一.简介 线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: ThreadPoolExecutor(int corePoolSize, int ...

  8. 0x01

    随便记录点想法什么的, 这个博客的编辑界面挺简陋的...

  9. leetcode 110 Balanced Binary Tree(DFS)

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...

  10. 基于 bi-LSTM和CRF的中文命名实体识别

    follow: https://github.com/zjy-ucas/ChineseNER  这里边主要识别的实体如图所示,其实也就主要识别人名PER,机构ORG和地点LOC: B表示开始的字节,I ...