与Kafka C#客户端异步

时间:2019-03-29 17:40:17

标签: c# asynchronous .net-core apache-kafka

我正在尝试将Kafka用于.NET Core项目中的发布/订阅体系结构。但是Confluent的Kafka c#客户端仅提供了一种同步“ Consume”方法来监听已发布的消息。这是提供的有关如何使用此客户端的示例代码:

var conf = new ConsumerConfig
    { 
        GroupId = "test-consumer-group",
        BootstrapServers = "localhost:9092",
        AutoOffsetReset = AutoOffsetReset.Earliest
    };

using (var c = new ConsumerBuilder<Ignore, string>(conf).Build())
{
    c.Subscribe("my-topic");

    CancellationTokenSource cts = new CancellationTokenSource();
    Console.CancelKeyPress += (_, e) => {
        e.Cancel = true; // prevent the process from terminating.
        cts.Cancel();
    };

    try
    {
        while (true)
        {
            try
            {
                var cr = c.Consume(cts.Token);
                Console.WriteLine($"Consumed message '{cr.Value}' at: '{cr.TopicPartitionOffset}'.");
            }
            catch (ConsumeException e)
            {
                Console.WriteLine($"Error occured: {e.Error.Reason}");
            }
        }
    }
    catch (OperationCanceledException)
    {
        // Ensure the consumer leaves the group cleanly and final offsets are committed.
        c.Close();
    }
}

我正在尝试使此调用异步。我尝试使用Task.RunThreadPool.QueueUserWorkItem。它们都按照异步方式工作,但是我看到它们都使用工作线程,其中“ Consume”方法处于空闲状态,等待消息。我想在大多数情况下在没有空闲线程的情况下创建异步。据我所知,async/await结构使任务排队,因此能够创建异步,而不会增加线程的负担。就我而言,怎么可能?

我认为ThreadPool.QueueUserWorkItem可以解决问题,只有在发出信号Consume时,才会使用线程池中的线程继续执行其余代码,但是我看到Consume等待空闲在自己的线程中。

0 个答案:

没有答案