LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C# 异步与Windows应用程序

admin
2025年2月12日 20:53 本文热度 126
本篇文章用WinForm演示,首先创建一个窗体,放一个按钮,并为按钮添加一个点击事件,正常情况下,该事件只由UI线程触发:

我们知道如果让UI控件在非UI线程中执行会出现异常,如下:
所以我们在操作UI控件时应该特别关注是否为UI线程。
一、UI事件中使用异步
打印如下:
在UI事件上添加async关键字,void保持不变(别改成Task),当await后自动切换回UI线程。
二、切换到UI线程
我们知道WinForm有BeginInvoke与Invoke,两者都是交给UI执行,我们对其简单的封装成扩展方法,如下:
现在演示:
打印结果如下:
如上,在使用ExecBeginInvoke与ExecInvoke扩展方法后,线程都切换回UI线程了。但注意的是ExecInvoke后的线程仍为3,因为ExecBeginInvoke与ExecInvoke只是把Action交给UI执行,并没有把当前线程改成UI线程。
三、避免堵塞情况

在Task上一起使用Wait和async关键字是很危险的。在使用同步化上下文的应用程序中,这很容易导致死锁。

在按钮点击事件中,调用本地函数DelayAsync。DelayAsync等待Task.Delay的完成,之后在前台线程中继续执行。但是,调用者在DelayAsync返回的任务上调用Wait()方法。Wait()方法阻塞调用线程,直到任务完成。在这种情况下,Wait()是从前台线程上调用的,因此Wait()会阻塞前台线程。Task.Delay上的Wait()永远无法完成,因为前台线程不可用。这是一个经典的死锁场景:

但你可以修改上下文,这样就不会发生死锁情况:

在UI中使用异步时,不建议使用Wait,建议像“演示一” 使用异步。


阅读原文:原文链接


该文章在 2025/2/13 8:44:10 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved