我是靠谱客的博主 开朗板凳,这篇文章主要介绍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+"rn"; 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();

所以异步方法的执行结果要放在回调函数中,这样就不会卡死主界面。

切记。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对靠谱客的支持。

最后

以上就是开朗板凳最近收集整理的关于c# winform异步不卡界面的实现方法的全部内容,更多相关c#内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(108)

评论列表共有 0 条评论

立即
投稿
返回
顶部