是否可以使用async / await将消息发布到RabbitMQ?

Pur*_*ome 6 .net c# rabbitmq async-await

我似乎找不到任何有关如何异步向RabbitMQ发布消息的信息。

我偶然发现的示例通常是关于使用async / await RabbitMQ 检索/使用消息。

var consumer = new AsyncEventingBasicConsumer(model);

consumer.Received += async (o, a) =>
{
    Console.WriteLine("Message Get" + a.DeliveryTag);
    await Task.Yield();
};
Run Code Online (Sandbox Code Playgroud)

是否有一些示例或示例代码?

编辑

这是我一直尝试使用的一些示例代码:

public Task AddMessageAsync(string content,
                            TimeSpan? timeToLive,
                            TimeSpan? initialVisibilityDelay,
                            CancellationToken cancellationToken)
{
    _logger.LogDebug("Starting to add a Message to queue. {content}", content);

    CheckRabbitMQPolicy(_logger).Execute(() =>
    {
        using (var connection = _factory.CreateConnection())
        {
            _logger.LogDebug("Created a connection to factory.");

            using (var channel = connection.CreateModel())
            {
                _logger.LogDebug("Created a channel");

                AddMessageToRabbitMQPolicy(_logger).Execute(() =>
                {
                    _logger.LogDebug("Check or Create a queue '{queueName}'", _queueName);
                    channel.QueueDeclare(queue: _queueName,
                                            durable: false, // Could be TRUE
                                            exclusive: false,
                                            autoDelete: false,
                                            arguments: null);
                    _logger.LogDebug("'{queueName}' exists or was created.", _queueName);

                    var body = Encoding.UTF8.GetBytes(content);

                    _logger.LogDebug("About to publish message to queue '{queueName}'", _queueName);

                    //var foo = new AsyncEventingBasicPublish()
                    channel.BasicPublish(exchange: "",
                                            routingKey: _queueName,
                                            basicProperties: null,
                                            body: body);
                    _logger.LogDebug("Message published to queue '{queueName}'", _queueName);
                });
            }
        }
    });

    return Task.CompletedTask;
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*ado 2

目前,RabbitMQ .NET 客户端仅支持异步消费。

如果您只想遵守合同,您可以Task.CompletedTask像您一样返回 。

如果您想开始一些工作并稍后观察它,您可以通过调用来包装该代码,或者只是将您想要从同步中断到异步的位置Task.Run放置。await Task.Yield()