这两个nservicebus语句有什么区别

mon*_*tro 0 nservicebus async-await

在一个文档中,他们说 IHandleMessages 处理程序必须以这种方式编写(当我在 Visual Studio 中选择“实现接口”选项时会自动生成签名):

public class PlaceOrderHandler : IHandleMessages<PlaceOrder>
{
    public Task Handle(PlaceOrder message, IMessageHandlerContext context)
    {
        var orderPlaced = new OrderPlaced { OrderId = message.OrderId };

        return context.Publish(orderPlaced);
    }
}
Run Code Online (Sandbox Code Playgroud)

而另一个文档说它必须这样写:

public class PlaceOrderHandler : IHandleMessages<PlaceOrder>
{
    public async Task Handle(PlaceOrder message, IMessageHandlerContext context)
    {
        var orderPlaced = new OrderPlaced { OrderId = message.OrderId };

        await context.Publish<OrderPlaced>(e => { e.OrderId = message.OrderId; });

    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道这两个陈述有什么区别,有人可以用简单的语言解释一下吗?

哪个选项是正确的?

Sea*_*man 5

两者都是正确的选择。两者之间的区别在于方法中如何处理单个异步操作Handle

在第一种情况下, aTask按原样返回。在第二种情况下,在Handle方法中等待发布。区别?在第一种情况下,当发布任务返回时,编译器不会创建异步状态机。在第二个场景中,创建了一个状态机。

哪个选项适合使用?他们都是正确的选择。如果一个方法被频繁调用并且您关心不发生不必要的分配,那么不等待就返回单个任务会更有效。

  • 您可以为 100% 的代码使用 `async Task` 和 `await`。带有 `return` 的 `Task` 是一种优化。这不是 NServiceBus 独有的,而是异步代码的工作方式。如果您想深入研究,您会发现每次使用 `await` 键时,C# 编译器都会在幕后生成一个异步状态机。再次,如果你不关心的细节,你可以一直使用 `async Task / await` 跳过并平静地生活。 (2认同)