当前位置:
首页 > Python基础教程 >
-
c# winform异步不卡界面的实现方法
快速阅读
如何在winform程序中,让界面不再卡死。 关于委托和AsyncCallback的使用。
界面卡死的原因是因为耗时任务的计算占用了主线程,导致主界面没有办法进行其它操作,比如拖动。造成界面卡死的现象。我们只需要把耗时任务放在子线程中执行就可以了。
子线程的计算结果 要更新到界面中,怎么更新呢,因为不能操作主线程 ,所以要用委托来实现 。
我们来看个例子。
场景
界面上一个按钮加一人richbox , 点击以后获得当前所在年份
代码实现
定义一个委托实现子线程更新主线程
1
2
3
4
5
6
7
|
public delegate void UpdateText( string message); public void UpdateTextMehod( string message) { richTextBox1.Text += message+ "\r\n" ; richTextBox1.ScrollToCaret(); } |
按钮的点击事件
func委托:表示模拟一个耗时的操作(2s),然后返回一个结果 。
Asynccallback:表示在相应异步操作完成时调用的方法。在这个方法中,获取异步执行的结果。
要获取异步执行的结果,要调用func.EncInvoke(IAsyncResult)
实例化更新主线程 的委托UpdateText,然后异步调用,在func委托的计算结果 赋值给界面
func异步调用 ,把该异步的的回调方法当做参数传入。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
Func< int > func = new Func< int >(() => { Thread.Sleep(2000); return DateTime.Now.Year; }); AsyncCallback callback= new AsyncCallback((x) => { var result=func.EndInvoke(x); UpdateText ut = new UpdateText(UpdateTextMehod); this .BeginInvoke(ut, result.ToString()); }); func.BeginInvoke(callback, "object vlaue" ); |
注意
最后一句代码,可以写成这样,但是会卡死,
1
2
3
|
var res =func.BeginInvoke( null , null ); var result1 = func.EndInvoke(res).ToString(); richTextBox1.Text += result1.ToString(); |
所以异步方法的执行结果要放在回调函数中,这样就不会卡死主界面。
切记。
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式