使用C#中的线程列表的同步消息

问题描述 投票:0回答:1

我想以固定数量的线程(即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个回答
0
投票

我相信最好先尝试在代码中修复几个问题,然后再着眼于为什么丢失线程名。

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

  2. 等待SendAsync调用,目前您的方法是火上浇油,忘记了,我真的不建议这样做。考虑将所有堆栈转换为异步。

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

© www.soinside.com 2019 - 2024. All rights reserved.