gpt4 book ai didi

c# - ThreadPool 错过事件

转载 作者:太空宇宙 更新时间:2023-11-03 22:51:40 26 4
gpt4 key购买 nike

我需要对事件进行排队并并行执行它们。

我的 C# 代码在阻塞集合中对事件进行排队,并使用 ThreadPool 在工作线程上执行每个事件。但是,如果事件以 2000 事件/秒或更高的速率排队,则会错过一些事件。当我搜索这个问题时,我发现 ThreadPool 可以拒绝某些请求或在没有线程可用时保留它们,来自 this link :

To make matters worse, incoming requests that depend on the threads from the thread pool may be on hold or may even be rejected primarily because the thread pool may not have available threads with it to handle an incoming request

注意:此问题仅在使用配备 Core i5 的笔记本电脑时出现,当我使用 Core 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;
}
}
}

最佳答案

看起来您的线程池没有问题。您似乎遇到了闭包问题。

您应该首先在循环内创建一个局部变量。问题在于,当线程池执行操作时,它引用的是不断变化的 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;
}
}
}

有关闭包的更多信息,请查看 here

关于c# - ThreadPool 错过事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47135546/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com