我想以固定数量的线程(即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);
}
}
我相信最好先尝试在代码中修复几个问题,然后再着眼于为什么丢失线程名。
要么为每个线程创建一个专用的EventHubClient,要么在Main中创建一次。每次新建时,您似乎都在覆盖相同的客户端指针。
等待SendAsync调用,目前您的方法是火上浇油,忘记了,我真的不建议这样做。考虑将所有堆栈转换为异步。
如果事件顺序很重要,请考虑使用PartitionSender。