防止多次调用事件方法(锁定)
本文关键字:方法 锁定 事件 调用 | 更新日期: 2023-09-27 18:06:25
我是c#和线程的新手,我有这个问题要解决:
我有一个处理一些数据的线程,并且不时(必要时)它会触发我的事件方法(DataProcessor),这是在启动线程之前设置的。这个线程在专有的dll中。所以我不能再影响DataProcessor的调用了。
public void DataProcessor(object sender)
{
//...
//do some stuff which take some time
}
我的问题是,有时当DataProcessor被触发并开始做一些事情时,它还没有完成,它会再次被触发,我有一个冲突。
我需要的是,当DataProcessor正在做一些事情时,所有其他数据都是不必要的,所以所有其他尝试处理另一个数据必须被忽略/跳过-与处理无关
事件处理程序应该用于执行非常快速的操作。我处理类似情况的方法是,当事件触发时,将一些"待办事项"项放入队列中。然后运行一个连续的线程来处理队列中的项。
简化此操作的一个好方法是使用BlockingCollection。您的线程只是在该集合上运行foreach
,这将阻止等待排队的项目。
您也可以在处理程序内部取消订阅事件,并在完成处理后重新订阅,但这样会丢失事件。