F # запустить блокирующий вызов в другом потоке, использовать в асинхронном рабочем процессе - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть блокирующий вызов blockingFoo(), который я хотел бы использовать в контексте async.Я хотел бы запустить его в другом потоке, чтобы не блокировать async.

Вот мое решение:

let asyncFoo = 
  async {
    blockingFoo() |> ignore
  }
  |> Async.StartAsTask
  |> Async.AwaitTask
  • Это правильный способ сделать это?

  • Будет ли это работать так, как ожидалось?

1 Ответ

0 голосов
/ 22 ноября 2018

Я думаю, ты немного потерян.Async.StartAsTask, за которым следует Async.AwaitTask, фактически отменяют друг друга, с побочным эффектом, который создает созданный в процессе Task, на самом деле запускает асинхронный блок, содержащий blockingFoo в пуле потоков.Так что это работает, но таким образом, что выдает ожидания.

Если вы хотите запустить оценку asyncFoo из другого асинхронного блока, более естественным способом сделать это будет использование Async.Start, если выне хочу ждать его завершения, или Async.StartChild, если вы это сделаете.

let asyncFoo = 
    async {
        blockingFoo() |> ignore
    }

async {
    // "fire and forget"
    asyncFoo |> Async.Start

    // trigger the computation
    let! comp = Async.StartChild asyncFoo

    // do other work here while comp is executing

    // await the results of comp
    do! comp
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...