首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ThreadPool错过事件

ThreadPool错过事件
EN

Stack Overflow用户
提问于 2017-11-06 11:08:15
回答 1查看 87关注 0票数 1

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

我的C#代码将阻塞集合中的事件排队,并使用ThreadPool在工作线程上执行每个事件。但是,如果事件以2000事件/秒或更多的速率排队,则会遗漏一些事件。当我搜索这个问题时,我发现ThreadPool可以从此链接拒绝某些请求,或者在没有可用线程的情况下保存它们。

更糟糕的是,依赖于线程池的线程的传入请求可能被搁置,或者甚至可能被拒绝,主要是因为线程池可能没有可用的线程来处理传入的请求。

注意:这个问题只有在使用带有核心i5的笔记本电脑时才会出现,当我用核心i7尝试它时,它才能正常工作。

下面是代码的一个片段:

代码语言:javascript
复制
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;
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2017-11-06 11:19:41

看起来您的线程池没有问题。看来您对闭包有问题。

您应该首先在循环中创建一个局部变量。问题是,当线程池执行该操作时,它引用的是不断更改的EventData data变量。因此,您应该首先创建一个局部变量。(这个变量将被打包到一个显示类中,因为局部变量是从一个方法引用的,该方法被放在一个列出作用域的列表中。)

代码语言:javascript
复制
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;
        }
    }
}

有关闭包的更多信息,请参见这里

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47135546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档