Как зарегистрировать AsyncEventingBasicConsumer в F # - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь создать asyncEventBasicConsumer в F #. Для этого мне нужно использовать add_Received со следующей подписью

member add_Received: 
   value: AsyncEventHandler<BasicDeliverEventArgs> 
       -> unit

Но я не знаю, как создать AsyncEventHandler из async {}

Это конкретная функция

let subscribe : Subscribe =
    fun factory queueName handleMessage ->
        let connection = factory.CreateConnection()
        let model = connection.CreateModel()
        let consumer = AsyncEventingBasicConsumer(model)
        consumer.add_Received //?? how create a AsyncEventHandler
        model.BasicConsume(queueName, false, consumer) |> ignore
        (fun () ->
        model.Close()
        connection.Close())

А вот код c #

static void Main(string[] args)
{
    var factory = new ConnectionFactory() { DispatchConsumersAsync = true };
    const string queueName = "myqueue";

    using (var connection = factory.CreateConnection())
    using (var channel = connection.CreateModel())
    {
        channel.QueueDeclare(queueName, true, false, false, null);

        // consumer

        var consumer = new AsyncEventingBasicConsumer(channel);
        consumer.Received += Consumer_Received;
        channel.BasicConsume(queueName, true, consumer);

        // publisher

        var props = channel.CreateBasicProperties();
        int i = 0;

        while (true)
        {
            var messageBody = Encoding.UTF8.GetBytes($"Message {++i}");
            channel.BasicPublish("", queueName, props, messageBody);
            Thread.Sleep(50);
        }
    }
}

private static async Task Consumer_Received(object sender, BasicDeliverEventArgs @event)
{
    var message = Encoding.UTF8.GetString(@event.Body);

    Console.WriteLine($"Begin processing {message}");

    await Task.Delay(250);

    Console.WriteLine($"End processing {message}");
}

1 Ответ

1 голос
/ 01 мая 2019

Это должно сработать

consumer.add_Received(fun sender event -> Consumer_Received sender event |> Async.StartAsTask :> Task) 

Известными точками являются приведение async к Task и повышение скорости Task<'a> к Task.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...