我正在尝试将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.Run
和ThreadPool.QueueUserWorkItem
。它们都按照异步方式工作,但是我看到它们都使用工作线程,其中“ Consume
”方法处于空闲状态,等待消息。我想在大多数情况下在没有空闲线程的情况下创建异步。据我所知,async/await
结构使任务排队,因此能够创建异步,而不会增加线程的负担。就我而言,怎么可能?
我认为ThreadPool.QueueUserWorkItem
可以解决问题,只有在发出信号Consume
时,才会使用线程池中的线程继续执行其余代码,但是我看到Consume
等待空闲在自己的线程中。