Asynchronous 这是否等同于Task.Run?

Asynchronous 这是否等同于Task.Run?,asynchronous,f#,task,Asynchronous,F#,Task,我正在编写一个F#应用程序,我希望尽可能避免对任务的显式引用。以下内容是否等同于Task.Run,还是我遗漏了什么 [] 模块异步= 让内联runInThreadPool backgroundTask=async{ 让originalContext=System.Threading.SynchronizationContext.Current do!Async.SwitchToThreadPool() 让!result=backgroundTask() do!Async.SwitchToCont

我正在编写一个F#应用程序,我希望尽可能避免对任务的显式引用。以下内容是否等同于
Task.Run
,还是我遗漏了什么

[]
模块异步=
让内联runInThreadPool backgroundTask=async{
让originalContext=System.Threading.SynchronizationContext.Current
do!Async.SwitchToThreadPool()
让!result=backgroundTask()
do!Async.SwitchToContext originalContext
返回结果}
示例用法(未测试):

async{//在UI线程上启动
让!result=Async.runInThreadPool(乐趣->异步{
设可变和=0
因为我在1..10000做
sum Async.startimimediate

正如@Daniel指出的,使用
Async.StartChild
可以更好地实现这一点,如下所示:

[<AutoOpen>]
module Async =        
    let inline runInThreadPool backgroundTask = async {
          let! result = backgroundTask() |> Async.StartChild
          return! result}
[]
模块异步=
让内联runInThreadPool backgroundTask=async{
让!result=backgroundTask()|>Async.StartChild
return!result}

我不明白这应该实现什么。它与
任务
有什么关系?
任务。运行
相当于
异步。启动
。您是否使用处理任务的API?如果是这样,您可以使用
异步.等待任务
轻松地将它们转换为
异步
。在任何情况下,我都看不到编写替换
Async.Start
。啊,明白了。我想做一些后台处理,目前正在使用
Task.Run
Async.waittask
。我想替换
Task.Run
s和
Async
,所以我想知道发布的代码是否等效(即在后台线程上运行,但在原始线程上运行延续)。我不确定线程行为,只是比较了
Task.Run
Async.Start
的文档,似乎它们是一样的block已在线程池中运行。您只需将
let!result=Async.runInThreadPool(fun\ux->Async{
更改为
let!result=Async{