架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 11202|回复: 1

[资料] .net/c#小心事件拖垮你的程序

[复制链接]
发表于 2016-9-21 16:05:58 | 显示全部楼层 |阅读模式
事件是加载在主线程上运行的,如果主线程第一个事件处理不完,你又来第二个事件,就像主线程中别的程序一样,等上一个处理完了再处理下一个或是别的在主线程中的程序或事件。


QQ截图20160921155529.jpg

上面是,我自己封装了一个对象,对象里面,我自己又封装了一个事件,

我在订阅事件的方法里面去处理数据,如图片注释的部分,

因为,我订阅的事件是读取的txt文件,我txt文件有5万行,导致事件方法会被促发5万次,一开始,我以为事件没有先后顺序,都是并行的吧。

然后,运行程序起来,我发现自己的界面出现了假死状态,我知道,自己那里肯定有问题,

我一开始以为是方法里面操作ui控件导致假死的,

然后,一步一步排查,发现,在往集合里面添加数据的时候,就已经进入了假死状态,

why???最后,我从网上发现,事件是在主线程上的,如果第一个事件处理不完,会阻塞下一个事件的执行,

我大体,明白点了什么,说白了,5万次事件导致程序阻塞了,然后,进入了假死状态,

解决方案:

把事件接收到的东西,采用多线程去处理,不要直接在事件方法里面写,对于,一些简单的事件,不会导致大量事件方法执行的,可以直接写到事件方法里面,

对于,大量调用事件方法的,希望大家开一个线程去处理,例如:socket或者httplistener等(数据量小看不出来,一旦数据量大,哈哈,直接死掉)




上一篇:c#批量生成邮箱地址代码
下一篇:云播播放器分析,迅雷和QQ旋风接口分析
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2016-9-22 09:23:17 | 显示全部楼层
有人发帖很好,支持下
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-25 16:01

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表