F# 6 .NET 任务 - 如何使用

Ale*_*ler 4 f#

F# 6引入了对 .NET 任务的支持。

该片段在各处共享 - 但是调用和使用任务结果(例如printf它)的正确方法是什么?

let readFilesTask (path1, path2) =
   task {
        let! bytes1 = File.ReadAllBytesAsync(path1)
        let! bytes2 = File.ReadAllBytesAsync(path2)
        return Array.append bytes1 bytes2
   }
Run Code Online (Sandbox Code Playgroud)

一种有效的选择是:

let result = readFilesTask ("filaA", "fileB")
printf $"%A{result.Result}"
Run Code Online (Sandbox Code Playgroud)

但这是预期的使用方式吗?

sdg*_*sdh 7

有几种处理任务的方法。什么是“预期”方式将取决于您想要实现的目标。

另请注意,对于许多应用程序来说,async它只是稍微慢一点,但更容易使用,因为它是“冷”的。

您可以使用let!和在另一个任务中使用一个任务do!

task {
  let! x = someOtherTask ()
  do! andAnotherTask ()
  return x
}
Run Code Online (Sandbox Code Playgroud)

您可以启动任务而不等待结果(即发即忘):

let foo () = 
  task {
    printfn "Done."
  }

foo () |> ignore // tasks are "hot" unlike asyncs
Run Code Online (Sandbox Code Playgroud)

您可以将任务变成Async<'t>使用Async.AwaitTask

async {
  do! 
    task {
      printfn "Done."
    }
    |> Async.AwaitTask
}
Run Code Online (Sandbox Code Playgroud)

您可以阻塞当前线程,直到任务完成:

let foo () = 
  task {
    printfn "Done."
  }

let t = foo ()
t.Result
Run Code Online (Sandbox Code Playgroud)

我预计大多数实际应用程序都会有很多do!andlet!语句,但只有很少的.Result调用以避免阻塞。