我需要排队事件并并行执行它们。
我的C#代码将阻塞集合中的事件排队,并使用ThreadPool在工作线程上执行每个事件。但是,如果事件以2000事件/秒或更多的速率排队,则会遗漏一些事件。当我搜索这个问题时,我发现ThreadPool可以从此链接拒绝某些请求,或者在没有可用线程的情况下保存它们。
更糟糕的是,依赖于线程池的线程的传入请求可能被搁置,或者甚至可能被拒绝,主要是因为线程池可能没有可用的线程来处理传入的请求。
注意:这个问题只有在使用带有核心i5的笔记本电脑时才会出现,当我用核心i7尝试它时,它才能正常工作。
下面是代码的一个片段:
public static void ExecuteEvents()
{
foreach (EventData data in blockingCollection.GetConsumingEnumerable())
{
switch (data.EventType)
{
case EventType1:
ThreadPool.QueueUserWorkItem(o =>
{
Function1(data);
});
break;
case EventType2:
ThreadPool.QueueUserWorkItem(o =>
{
Function2(data);
});
default:
break;
}
}
}发布于 2017-11-06 11:19:41
看起来您的线程池没有问题。看来您对闭包有问题。
您应该首先在循环中创建一个局部变量。问题是,当线程池执行该操作时,它引用的是不断更改的EventData data变量。因此,您应该首先创建一个局部变量。(这个变量将被打包到一个显示类中,因为局部变量是从一个方法引用的,该方法被放在一个列出作用域的列表中。)
public static void ExecuteEvents()
{
foreach (EventData data in blockingCollection.GetConsumingEnumerable())
{
var local = data;
switch (local.EventType)
{
case EventType1:
ThreadPool.QueueUserWorkItem(o =>
{
Function1(local);
});
break;
case EventType2:
ThreadPool.QueueUserWorkItem(o =>
{
Function2(local);
});
default:
break;
}
}
}有关闭包的更多信息,请参见这里
https://stackoverflow.com/questions/47135546
复制相似问题