嗨,我正在使用c#应用程序。我有异步方法,它将从kafka读取数据。下面是我的实现。
public async Task SubscribeAsync(string topicName)
{
ConsumeResult<string, TValue> consumeResult;
await Task.Run(() =>
{
consumer.Subscribe(topicName);
try
{
consumeResult = consumer.Consume();
ProcessEvents(consumeResult.Value);
}
catch (ConsumeException e)
{
logger.Error($"Consume error: {e.Error.Reason}");
}
});
}
我称它为
var response = kafkaClient.SubscribeAsync(topicConfigCollection.GetTopicName("TimephaseEventTopic"));
response.Wait();
response.IsCompletedSuccessfully.ShouldBeTrue();
上面的代码中的问题是,每当我调试时,它会在等待到来时挂起,然后什么也不会发生。如果删除await Task.Run(),那么我将可以进入方法内部,并且可以看到consumerresult的结果。我可以知道如何正确实施吗?任何帮助,将不胜感激。谢谢。
答案 0 :(得分:0)
这些方法都不是 async 还是返回Task
?因此,除非您要卸载线程并假装其 async 性质,否则似乎不需要使用 async and await模式
让我建议这个同步代码
public ConsumeResult<string, TValue> SubscribeAsync(string topicName)
{
consumer.Subscribe(topicName);
try
{
var consumeResult = consumer.Consume();
ProcessEvents(consumeResult.Value);
return consumeResult;
}
catch (ConsumeException e)
{
logger.Error($"Consume error: {e.Error.Reason}");
}
return null;
}
用法
var response = kafkaClient.SubscribeAsync(topicConfigCollection.GetTopicName("TimephaseEventTopic"));
if(response != null)
response.IsCompletedSuccessfully.ShouldBeTrue();
注意:这只是一个示例,可能不是如何使用您的库的,但是它不会死锁