2011-08-24 57 views
2

我很新的C#和线程,和我有这个问题要解决:防止多个呼叫事件方法(锁定)

我有处理一些数据,并时不时线程(在必要时)它会触发我在启动线程之前设置的事件方法(DataProcessor)。此线程在专有的dll中。所以我不能再影响DataProcessor的调用了。

public void DataProcessor(object sender) 
{ 
//... 
//do some stuff which take some time 
} 

我的问题是,从时间到时数据处理器被触发,并开始做一些东西,这还不算完呢,它的再次发射和我有冲突。

我需要的是,当DataProcessor做某些事情时,所有其他数据都是不必要的,因此所有其他处理其他数据的尝试都必须被忽略/跳过 - 与处理无关。

+0

标题中不需要“C#”。我们在[SO]上有这样的标签。 –

回答

1

事件处理程序应该用来执行非常快速的操作。我处理类似情况的方式是当事件触发时,将一些“待办事项”项放入队列中。然后我运行一个处理队列中项目的连续线程。

简化此操作的一个好方法是使用BlockingCollection。你的线程只会在该集合上运行一个foreach,这会阻止等待入队的项目。

当您处于处理程序中时,您也可以取消订阅该事件,并在处理完成后重新订阅,但这样会失去事件。

+0

“简化此操作的一个好方法是使用BlockingCollection。您的线程只是对该集合运行一个foreach,这会阻止等待排队的项目。” 我不太明白这一点。你的意思是,使用locker在DataProcessor内部锁定,然后删除等待队列中的所有其他项目?你能写一个例子吗?我需要一个最简单,最快的解决方案,因为我需要尽可能多地处理数据。不要问我为什么在DataProcessor运行期间需要抛出其他数据,它必须这样做。谢谢。 – uniquepito

+0

如果您需要忽略处理过程中发生的事件,请忽略我的答案的第一部分,然后退订该事件:'myevent - =(s,e)=> DataProcessor(s);'或您的相当于(只需更改用于订阅“ - =”的'+ ='即可取消订阅)。处理结束后,重新订阅。 – drharris

+0

通过 - =似乎是一个很好的解决方案来移除处理程序,直到我将应用程序放到真正的环境中,经常会触发处理程序,同时我通过移除处理程序 - =它开始再次运行处理程序并导致应用程序冻结,所以我如何序列化(或者更确切地说忽略其他事件)呢? – uniquepito