一次使用AutoResetEvent的经历:在Task并发环境下导致UI线程卡死 内存一直上涨

编程开发
72
wpf
AutoResetEvent
Task
异步线程
UI线程卡死

前段时间在升级优化tk精灵的时候,用到了AutoResetEvent来控制内部监护逻辑的监护线程并发量来规避同时多个线程处理同一任务而出现的线程安全问题,在测试期间发现部分运行的测试服务器上出现UI线程直接卡死无法进行界面交互,并且内存处于缓慢持续上涨状态,基本运行一周左右的样子程序就自行崩溃了,因为这个问题 好几个用户都有反馈程序崩溃弹窗的问题。近期总算是解决了这个坑。

一次使用AutoResetEvent的经历:在Task并发环境下导致UI线程卡死 内存一直上涨

简单总结了一下:

WPF开发软件的情况下使用Task并发环境可以方便地创建和管理多个线程。然而AutoResetEvent是一种同步原语,它用于在多线程编程中控制线程的执行。它的工作方式是,当一个线程请求事件时,如果没有其他线程已经释放该事件,那么请求的线程将被阻塞,直到另一个线程释放该事件。然后,被阻塞的线程会继续执行。

然而在某些情况下,可能会发生多个线程同时请求事件,但由于AutoResetEvent的特性,每次只能释放一个线程。这可能导致其他线程被永久阻塞,造成UI线程卡死的现象。 更糟糕的是,由于被阻塞的线程会一直占用内存,如果同时有大量的线程被阻塞,可能会导致内存上涨,最终导致应用程序性能下降或崩溃。

解决这个问题的一种方法是使用其他的同步原语,例如Semaphore,它允许多个线程同时运行,而不是只允许一个线程运行。另一种方法是优化代码,避免过多的线程阻塞,从而减少内存占用。

总的来说,使用AutoResetEvent时需要注意,尤其是在多线程环境下。要确保代码的正确性,避免UI线程卡死和内存上涨等问题。对于可能出现的问题,要有预见性,提前预防,从而保证应用程序的稳定性和性能。

WPF 实现抽奖功能的全屏弹幕滚动效果
WPF使用popup控件实现弹出式提示
WPF MVVM双向通信 数据模型绑定 简单实例
WPF开发样式文件的四种引用方式
.NET程序系统托盘运行出现多个同样的托盘图标的解决方法
Windows桌面开发优秀的WPF界面开源UI组件 MahApps.Metro
wpf调用文件目录打开目录选择对话框
关于WPF中Frame使用新Page切换内存上涨问题
wpf、winform最大化被任务栏遮挡的解决办法
 WPF Rectangle实现 虚线边框矩形 超简单
.NET环境下System.Drawing.Color对应的颜色值RGB对照表
WPF DataGrid不同数据源如何动态生成不同字段名的表格
暂无相关内容...
WPF实现读取USB摄像头实时视频展示以及导出实时截图的C#源码例子
[人脸检测]基于C#OpenCvSharp+haarcascade人脸、人眼模型实现人脸检测源码
C#+WPF实现模仿实现的网易云音乐客户端源码
wpf实现大屏幕弹幕播放效果特效源码新手可参考下.rar
WPF实现的自定义工作大日历排班Calendar控件模板的例子源码
免责声明 部分转载分享内容若侵犯您的权益,还请 邮件联系 侵删