- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要对事件进行排队并并行执行它们。
我的 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/
我正在使用 Azure 函数处理来自 IOT 中心的消息并将其输出到 Blob 存储。 enter image description here 但是当我高频发送时,该功能丢失了 IOT 消息。例如,
我正在尝试使用 mediasoup 通过 room.createRtpStreamer 转发 RTP 流 我的问题是我从 producer.rtpParameters.codecs[i].payloa
我正在尝试使用 mediasoup 通过 room.createRtpStreamer 转发 RTP 流 我的问题是我从 producer.rtpParameters.codecs[i].payloa
我正在使用 Spring 应用程序事件将信息发送到其他 bean。有一个 bean A,一旦 A 初始化,它就会发布一个事件。并且有一个 bean B 监听 A 发送的事件。 根据 A 在其他 Bea
CMake 有 Qt4 的特殊变量 ${QT_DEFINITIONS},其中包含 QT 定义,例如 QT_NO_DEBUG 和 QT_DEBUG。 Qt5 没有这样的选项。 如何在 cmake 中添加
我是一名优秀的程序员,十分优秀!