微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#.Net 框架中 BlockingCollection 的问题 用户类主程序输出观察

如何解决C#.Net 框架中 BlockingCollection 的问题 用户类主程序输出观察

设置

  1. 假设我需要构建一个应用程序,该应用程序需要每 800 毫秒为 100 多个用户同时提供一些数据
  2. 如果 800 毫秒内没有数据,我需要向客户端发送检测信号,表明服务处于活动状态。

实验

我正在尝试使用 C# 的 BlockingCollection 来实现这一点。这是示例

用户

    class EachUserClass
    {
        public EachUserClass()
        {
            id = incrementer++;
            Task.Run(() => StartProcessing());
        }
        private static int incrementer = 0;
        private int id = 0;
        BlockingCollection<string> collection = new BlockingCollection<string>();
        public void StartProcessing()
        {
            while (true)
            {
                var incoming = "";
                if (collection.TryTake(out incoming,800))
                {
                    //
                }
                else
                {
                    if(id == 99)
                        Console.WriteLine( DateTime.Now.ToString() + " - Timeout on " + id);
                }
            }
        }
    }

主程序

        static void Main(string[] args)
        {
            Console.WriteLine("App started at: " + DateTime.Now.ToString());
            for (int i = 0; i < 100; i++)
            {
                new EachUserClass();
            }
            Console.ReadKey();
        }

输出

App started at: 16-04-2021 15:45:37
16-04-2021 15:47:08 - Timeout on 99
16-04-2021 15:47:09 - Timeout on 99
16-04-2021 15:47:10 - Timeout on 99

观察

您可以看到 AppStart 和向第 99 个用户发送超时之间存在巨大延迟。这是因为我试图在线程池上快速连续地启动 100 个任务。

Threads Count

任何建议异步运行它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。