『QQ:1353814576』

在wpf开中使用AutoResetEvent在Task并发环境下导致UI线程卡死内存上涨问题。


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

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

简单总结了一下:

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

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

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

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