F#在另一个线程上运行阻塞调用,在异步工作流中使用

时间:2018-11-22 16:10:32

标签: asynchronous f#

我有一个要在blockingFoo()上下文中使用的阻塞调用async。我想在另一个线程上运行它,以免阻塞async

这是我的解决方法:

let asyncFoo = 
  async {
    blockingFoo() |> ignore
  }
  |> Async.StartAsTask
  |> Async.AwaitTask
  • 这是执行此操作的正确方法吗?

  • 这项工作会按预期进行吗?

1 个答案:

答案 0 :(得分:5)

我认为您有点迷路了。 Async.StartAsTask后跟Async.AwaitTask有效地互相抵消,其副作用是在进程中创建的Task实际上触发了线程池上包含blockingFoo的异步块的评估。这样行之有效,但以某种方式超出了期望。

如果您想从另一个异步块中触发对asyncFoo的评估,一种更自然的方法是,如果您不想等待其完成,请使用Async.Start,或者{ {1}}(如果这样做)。

Async.StartChild