Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 防止调用多个调用事件方法(锁定)_C#_Multithreading_Locking - Fatal编程技术网

C# 防止调用多个调用事件方法(锁定)

C# 防止调用多个调用事件方法(锁定),c#,multithreading,locking,C#,Multithreading,Locking,我对C#和线程非常陌生,我有一个问题需要解决: 我有一个处理一些数据的线程,它会不时(在必要时)触发在启动线程之前设置的事件方法(DataProcessor)。此线程位于专有dll中。所以我不能再影响数据处理器的调用了 public void DataProcessor(object sender) { //... //do some stuff which take some time } 我的问题是,当DataProcessor被启动并开始做一些事情,但它还没有完成时,它会再次被启动,我

我对C#和线程非常陌生,我有一个问题需要解决:

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

public void DataProcessor(object sender) 
{
//...
//do some stuff which take some time
}
我的问题是,当DataProcessor被启动并开始做一些事情,但它还没有完成时,它会再次被启动,我会有冲突


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

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


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


您也可以在处理程序中取消订阅事件,并在处理完毕后重新订阅,但这样会丢失事件。

标题中不需要“C”。我们有相应的标签。“简化此操作的一个好方法是使用BlockingCollection。您的线程只是在该集合上运行foreach,这将阻止等待排队的项目。”我不太理解这一点。您的意思是,在数据处理器中使用locker Do lock,然后删除等待队列中的所有其他项目吗?你能写一个例子吗?我需要一个最简单、最快的解决方案,因为我需要处理尽可能多的数据。不要问我为什么需要在DataProcessor运行时抛出任何其他数据,必须这样做。谢谢。如果您需要忽略在处理过程中发生的事件,请忽略我答案的第一部分,然后简单地取消订阅事件:
myevent-=(s,e)=>DataProcessor(s)
或您的等效项(只需将订阅
-=
+=
更改为取消订阅)。处理结束后,重新订阅。通过-=删除处理程序似乎是一个好的解决方案,直到我将我的应用程序放到真实的环境中,在那里处理程序经常被触发,同时我通过-=删除处理程序,它再次开始运行处理程序并导致应用程序冻结,那么我如何序列化(或者忽略其他事件)那个