Я хочу разгрузить обработчик, используемый для подписки на RabbitMQ с EasyNetQ, в C # я получаю то, что хочу, потому что сам обработчик помечен как async
, и, следовательно, внутри я могу ожидать разгрузки, другими словами:
var subscription = bus.PubSub.Subscribe<Message>("subscriptionId", async message =>
{
// Await Offloading
await Task.Run(() =>
{
// If it throws something here, it still bubble up to the handler
});
});
Однако в F # я полностью озадачен, может ли код C # быть правильно переведен в F #?
Я начал что-то составлять, но это явно не решение
let handle (message: Message) = async{
printfn "%A" message
}
let subscription = bus.PubSub.Subscribe<Message>("subscriptionId", fun message ->
handle message
|> Async.Start
)
Этот фрагмент кода F # неправильно отвечает на мой вопрос, он состоит из двух частей:
handle
не ожидается
- исключения, которые могут возникнуть в
handle
, не всплывают до обработчика fun
Другой неправильный способ решения проблемы:
let handle (message: Message) = async{
printfn "%A" message
}
let subscription = bus.PubSub.Subscribe<Message>("subscriptionId", fun message ->
handle message
|> Async.RunSynchronously
)
Но хотя это и ожидается (в отличие от приведенного выше фрагмента), он выполняется в том же потоке и не выгружает работу в поток пула потоков.