来自阻止UI的线程的事件太多

时间:2014-03-25 16:58:52

标签: .net multithreading events

我的软件会分析包含数据的文件。为了准确了解分析进度,每次分析文件行时都会引发事件。分析过程在UI线程中以不同的线程执行。然后,UI线程处理事件并更新进度条。

当一次只分析一个文件时,软件运行得非常好,但如果同时分析多个文件(4个不同线程中最多4个文件),看起来有这么多&#34 ;文件读取事件"正在处理的事件是鼠标点击按钮,窗口调整大小事件和窗口移动事件等UI事件放在事件队列的末尾。结果是这些UI事件的处理时间比它们被引发的时间要晚得多。

例如:当我按下底部的取消按钮时(下图)。 button.click事件仅在进度条完全填充时处理。当我将鼠标悬停在它们上方时,按钮不会突出显示,我无法调整窗口大小等。

enter image description here

我的问题是:有没有办法可以优先处理来自用户界面的事件?或者我可以处理分析事件并更新不同线程中的进度条吗?如何让这些按钮实时响应?

我知道,如果我减少了提升的事件数量,我将实现我想要的目标,但我想知道是否有其他解决方案。

2 个答案:

答案 0 :(得分:1)

在这种情况下我会使用不同的方法:让所有线程更新简单计数器(内部数据,如Dim Progress1 As Integer),并使主(UI)线程读取Timer事件上的计数器(例如,每100毫秒)。这对用户来说足够快,并且不会堵塞"你的UI线程。您可以在读/写这些计数器时使用SyncLock,以确保获得组合数据。

请注意,过多的UI更新会浪费您可以用来做实际工作的CPU周期!

答案 1 :(得分:0)

您可以使用SemaphoreSlim类来限制可以同时进行分析的并发线程数量。

如果您的硬盘速度不够快和/或您只有一台处理器,即使是两次并发分析也是如此。

如果文件是排序的并且您可以将整个内容加载到内存中,则允许相同的并发分析而不是可用处理器的数量。如果文件很大,每次都要尝试处理大块信息。

你可能有多个核心,但是如果你的硬盘速度不快和/或你强迫它从一个地方跳到另一个地方读取数据块......那么硬盘将成为瓶颈。

重要的是你做一些调整以找到哪个是正确的平衡。