C# 同步调用ProcessEventsAsync以接收C中的消息#

C# 同步调用ProcessEventsAsync以接收C中的消息#,c#,azure,azure-eventhub,C#,Azure,Azure Eventhub,我有一个用C#编写的Windows服务,它订阅事件中心并监听它们的任何消息 我遵循的准则如下: public class SimpleEventProcessor : IEventProcessor { public Task CloseAsync(PartitionContext context, CloseReason reason) { Console.WriteLine($"Processor Shutting Down. Partition '{conte

我有一个用C#编写的Windows服务,它订阅事件中心并监听它们的任何消息

我遵循的准则如下:

public class SimpleEventProcessor : IEventProcessor
{
    public Task CloseAsync(PartitionContext context, CloseReason reason)
    {
       Console.WriteLine($"Processor Shutting Down. Partition '{context.PartitionId}', Reason: '{reason}'.");
       return Task.CompletedTask;
    }

    public Task OpenAsync(PartitionContext context)
    {
       Console.WriteLine($"SimpleEventProcessor initialized. Partition: '{context.PartitionId}'");
       return Task.CompletedTask;
     }

    public Task ProcessErrorAsync(PartitionContext context, Exception error)
    {
       Console.WriteLine($"Error on Partition: {context.PartitionId}, Error: {error.Message}");
       return Task.CompletedTask;
    }

    public Task ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> messages)
    {
       foreach (var eventData in messages)
       {
          var data = Encoding.UTF8.GetString(eventData.Body.Array, eventData.Body.Offset, eventData.Body.Count);
          Console.WriteLine($"Message received. Partition: '{context.PartitionId}', Data: '{data}'");
          DoSomethingWithMessage(); // typically takes 20-20 mins to finish this method.
       }
       return context.CheckpointAsync();
    }
} 
公共类SimpleEventProcessor:IEventProcessor
{
公共任务CloseAsync(PartitionContext上下文,CloseReason)
{
WriteLine($“处理器正在关闭.Partition'{context.PartitionId}',原因:'{Reason}'”;
返回Task.CompletedTask;
}
公共任务OpenAsync(PartitionContext上下文)
{
WriteLine($“SimpleEventProcessor initialized.Partition:“{context.PartitionId}”);
返回Task.CompletedTask;
}
公共任务ProcessErrorAsync(PartitionContext上下文,异常错误)
{
WriteLine($”分区上的错误:{context.PartitionId},错误:{Error.Message}”);
返回Task.CompletedTask;
}
公共任务进程事件同步(PartitionContext上下文,IEnumerable消息)
{
foreach(消息中的var eventData)
{
var data=Encoding.UTF8.GetString(eventData.Body.Array、eventData.Body.Offset、eventData.Body.Count);
WriteLine($”消息已接收。分区:“{context.PartitionId}”,数据:“{Data}”);
DoSomethingWithMessage();//完成此方法通常需要20-20分钟。
}
返回context.CheckpointAsync();
}
} 
这是文档中提到的示例代码

现在我的事件中心上有8个分区。因此,当有新消息时,8个分区会继续接收消息。每当收到消息时,都会调用一个方法
DoSomethingWithMessage()
,该方法在执行一些计算时需要大约30分钟才能完成

我希望我的代码同步运行,这意味着当接收到一条消息时,服务应该首先完成此方法的执行,然后接收下一条消息。现在发生的情况是,即使
DoSomethingWithMessage()
仍在执行中,也会收到新消息,并且该消息与第一条消息并行处理,这会造成一些计算问题


有没有办法让我一条接一条地接收信息?

你每分钟收到多少条信息?如果处理单个消息需要30分钟,并且您希望逐个处理它们,那么最好使用队列。事件中心用于每秒流式传输和处理(数以万计)数千条消息。另外,8个分区,由于每个分区将处理消息,因此选择此选项的原因是什么?@PeterBons我们有8个VM安装了此windows服务。所以有8个分区。所有8个虚拟机都订阅同一个事件中心。我们收到的典型消息是每10-15分钟发送1-2条消息。并不是所有的过程都需要30分钟。这是我提到的平均时间。我们还计划改为卡夫卡队列,而不是活动中心,但在不久的将来不计划。好的。现在,您可以做的是让所有事件处理器实例将消息转发到azure存储/服务总线队列,并设置一个侦听器来处理这些消息。