如何在C#中运行异步代码并返回值?

时间:2019-07-12 04:43:46

标签: c# async-await

嗨,我正在使用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的结果。我可以知道如何正确实施吗?任何帮助,将不胜感激。谢谢。

1 个答案:

答案 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();

注意:这只是一个示例,可能不是如何使用您的库的,但是它不会死锁