.net core 在.Net Core 3.1应用程序的ExecuteAsync中等待后,后台服务将被阻止

.net core 在.Net Core 3.1应用程序的ExecuteAsync中等待后,后台服务将被阻止,.net-core,apache-kafka,async-await,delegates,background-service,.net Core,Apache Kafka,Async Await,Delegates,Background Service,我需要一个服务,不断轮询来自Kafka主题的消息,将消息提供给处理任务,从该任务获取结果,并将其推送到另一个Kafka主题。我使用.Net Core 3.1中的BackgroundService作为基本基础设施,同时我编写了一个ConsumerProducer类来封装Kafka的内容,该类具有以下公共方法: public async Task ReceiveAndReply(ReplyCallback replyCallback) { try {

我需要一个服务,不断轮询来自Kafka主题的消息,将消息提供给处理任务,从该任务获取结果,并将其推送到另一个Kafka主题。我使用.Net Core 3.1中的BackgroundService作为基本基础设施,同时我编写了一个ConsumerProducer类来封装Kafka的内容,该类具有以下公共方法:

    public async Task ReceiveAndReply(ReplyCallback replyCallback)
    {
        try
        {
            var msg = consumer.Pull();

            var reply = await replyCallback(msg);

            producer.PushAsync((message)reply);
        }
        catch (Exception e)
        {
            throw new Exception(e.InnerException.Message);
        };

    }
BackgroundService派生类如下所示:

public class Worker : BackgroundService{

    // initialization stuff....

   protected ReplyCallback processDelegate = new ReplyCallback(ProcessQuery);

    protected static Task<message> ProcessQuery(message source)
    {
        return new Task<message>>(() => 
        {
            
            try
            {
                var messagePayload= ProcessPulledMessage(source);

                var replyMessage = new Message(messagePayload);

                return replyMessage;
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
                return null;
            }
        });
    }
    

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {

        while (!stoppingToken.IsCancellationRequested)
        {
            try
            {
                await connector.ReceiveAndReply(processDelegate);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.InnerException.Message);
            }
        }
    }


}
public class Worker:BackgroundService{
//初始化的东西。。。。
受保护的ReplyCallback processDelegate=新的ReplyCallback(ProcessQuery);
受保护的静态任务ProcessQuery(消息源)
{
返回新任务>(()=>
{
尝试
{
var messagePayload=ProcessPulledMessage(源);
var replyMessage=新消息(messagePayload);
回复信息;
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
返回null;
}
});
}
受保护的覆盖异步任务ExecuteAsync(CancellationToken stoppingToken)
{
同时(!stoppingToken.IsCancellationRequested)
{
尝试
{
等待连接器。接收并提交(processDelegate);
}
捕获(例外情况除外)
{
抛出新异常(例如InnerException.Message);
}
}
}
}
代码被简化了,但它描述了这种情况。在运行时,我能够使用来自主题的消息,但当在ProcessQuery中等待任务时,执行退出,应用程序继续运行,但等待的任务永远不会执行。 也许我做了一些完全错误的事情,我不擅长复杂的异步工作,所以任何提示都是非常受欢迎的。
谢谢

您正在返回一个未启动的任务

该文件适用于以下国家:

实例化任务对象并启动任务的最常用方法是调用static或TaskFactory.StartNew(Action)方法,而不是调用此构造函数


是否有意在
producer.PushAsync((消息)回复)之前没有
wait
?我认为try/catch如果失败将无法捕获,因为异步上下文在没有等待的情况下丢失。它由底层实现处理,并返回void。无论如何,问题发生在等待之前。