【问题标题】:Synchronous message using list of threads in C#使用 C# 中的线程列表同步消息
【发布时间】:2020-02-07 10:58:11
【问题描述】:

我想以设定的线程数(即 4 个线程)向事件中心发送消息列表。我希望消息同步发送。问题是,当我尝试打印有效负载时,由于某种原因,它在第二次迭代之后没有打印出线程名称,即 1、2、3 和 0。是不是我做错了什么?

Thread 1 - Sending message 1
Thread 2 - Sending message 1
Thread 3 - Sending message 1
Thread 0 - Sending message 1
Thread  - Sending message 2
Thread  - Sending message 2
Thread  - Sending message 2
Thread  - Sending message 2
Thread  - Sending message 3
Thread  - Sending message 3
Thread  - Sending message 3
Thread  - Sending message 3  
        public static void Main(string[] args)
        {
                for (int i = 0; i < numberOfDevices; i++)
                {
                    Thread thread = new Thread(() => { SendMessage(data); });
                    thread.Name = i.ToString();
                    listOfThreads.Add(thread);
                }
         }

        private static void StartThreads(List<Thread> lstThreads)
        {
            foreach (Thread th in lstThreads)
            {
                th.Start();
            }  
        }
        private static void SendMessage(string payload)
        {
            var connectionStringBuilder = new EventHubsConnectionStringBuilder(EventHubConnectionString)
            {
                EntityPath = EventHubName
            };

            eventHubClient = EventHubClient.CreateFromConnectionString(connectionStringBuilder.ToString());

            SendMessagesToEventHub(payload);

            eventHubClient.Close();
        }

        private static void SendMessagesToEventHub(string payload)
        {
            for (var i = 0; i < numberOfMsgs; i++)
            {
                try
                {
                    var message = $"Message: {payload}";
                    Console.WriteLine($"Thread {Thread.CurrentThread.Name} - Sending message {i + 1}");
                    eventHubClient.SendAsync(new EventData(Encoding.UTF8.GetBytes(message)));
                }
                catch (Exception exception)
                {
                    Console.WriteLine($"{DateTime.Now} > Exception: {exception.Message}");
                }

                Task.Delay(interval);
            }
        }


【问题讨论】:

    标签: c# asp.net azure asp.net-core azure-eventhub


    【解决方案1】:

    我认为最好先尝试修复代码中的一些问题,然后再关注线程名称丢失的原因。

    1. 要么为每个线程创建一个专用的 EventHubClient,要么在 Main 中创建一次。每次更新时,您显然都会覆盖相同的客户端指针。

    2. 等待 SendAsync 调用,目前您的方法是一劳永逸,我真的不建议这样做。考虑将所有堆栈转换为异步。

    3. 如果事件顺序很重要,请考虑使用 PartitionSender。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2011-02-01
      • 2011-03-13
      • 2020-07-29
      • 1970-01-01
      相关资源
      最近更新 更多