c# winform异步不卡界面的实现方法
- 作者: 尐叄
- 来源: 51数据库
- 2021-08-02
快速阅读
如何在winform程序中,让界面不再卡死。 关于委托和asynccallback的使用。
界面卡死的原因是因为耗时任务的计算占用了主线程,导致主界面没有办法进行其它操作,比如拖动。造成界面卡死的现象。我们只需要把耗时任务放在子线程中执行就可以了。
子线程的计算结果 要更新到界面中,怎么更新呢,因为不能操作主线程 ,所以要用委托来实现 。
我们来看个例子。
场景
界面上一个按钮加一人richbox , 点击以后获得当前所在年份

代码实现
定义一个委托实现子线程更新主线程
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异步调用 ,把该异步的的回调方法当做参数传入。
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");
注意
最后一句代码,可以写成这样,但是会卡死,
var res =func.begininvoke(null,null); var result1 = func.endinvoke(res).tostring(); richtextbox1.text += result1.tostring();
所以异步方法的执行结果要放在回调函数中,这样就不会卡死主界面。
切记。

总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
推荐阅读
- C#通过fleck实现wss协议的WebSocket多人Web实时聊天(附源码)
- 团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
- 使用 MSBuild.exe 在发布模式下构建 C# 解决方案
- 当我发布 Web 应用程序时,AfterPublish 脚本不运行
- 构建时 T4 转换的产品仅在下一个构建中使用
- ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
- 新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
- 如何将条件编译符号(DefineConstants)传递给 msbuild
- MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
- NuGet 包还原找不到包,没有源
热点文章
团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
0
使用 MSBuild.exe 在发布模式下构建 C# 解决方案
0
当我发布 Web 应用程序时,AfterPublish 脚本不运行
0
构建时 T4 转换的产品仅在下一个构建中使用
0
ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
0
新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
0
如何将条件编译符号(DefineConstants)传递给 msbuild
0
MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
0
NuGet 包还原找不到包,没有源
0
使用 C# 6.0 功能运行 TFS 构建
0
