F# 6 .NET 任务 - 如何使用
F# 6 .NET tasks - how to use
F# 6 introduced 支持 .NET 任务。
此代码段随处共享 - 但调用和使用任务结果的正确方法是什么(例如 printf
它)?
let readFilesTask (path1, path2) =
task {
let! bytes1 = File.ReadAllBytesAsync(path1)
let! bytes2 = File.ReadAllBytesAsync(path2)
return Array.append bytes1 bytes2
}
一个可行的选项是:
let result = readFilesTask ("filaA", "fileB")
printf $"%A{result.Result}"
但这是预期的使用方式吗?
有几种处理任务的方法。什么是“预期”方式将取决于您要实现的目标。
另请注意,对于许多应用程序,async
只是稍微慢一点,但更容易使用,因为它是“冷”的。
您可以使用 let!
和 do!
:
在另一个任务中使用一个任务
task {
let! x = someOtherTask ()
do! andAnotherTask ()
return x
}
您可以开始任务而不是等待结果(即发即弃):
let foo () =
task {
printfn "Done."
}
foo () |> ignore // tasks are "hot" unlike asyncs
您可以使用 Async.AwaitTask
:
将任务变成 Async<'t>
async {
do!
task {
printfn "Done."
}
|> Async.AwaitTask
}
您可以阻塞当前线程直到任务完成:
let foo () =
task {
printfn "Done."
}
let t = foo ()
t.Result
我预计大多数实际应用程序会有很多 do!
和 let!
语句,但只有少数 .Result
调用以避免阻塞。
F# 6 introduced 支持 .NET 任务。
此代码段随处共享 - 但调用和使用任务结果的正确方法是什么(例如 printf
它)?
let readFilesTask (path1, path2) =
task {
let! bytes1 = File.ReadAllBytesAsync(path1)
let! bytes2 = File.ReadAllBytesAsync(path2)
return Array.append bytes1 bytes2
}
一个可行的选项是:
let result = readFilesTask ("filaA", "fileB")
printf $"%A{result.Result}"
但这是预期的使用方式吗?
有几种处理任务的方法。什么是“预期”方式将取决于您要实现的目标。
另请注意,对于许多应用程序,async
只是稍微慢一点,但更容易使用,因为它是“冷”的。
您可以使用 let!
和 do!
:
task {
let! x = someOtherTask ()
do! andAnotherTask ()
return x
}
您可以开始任务而不是等待结果(即发即弃):
let foo () =
task {
printfn "Done."
}
foo () |> ignore // tasks are "hot" unlike asyncs
您可以使用 Async.AwaitTask
:
Async<'t>
async {
do!
task {
printfn "Done."
}
|> Async.AwaitTask
}
您可以阻塞当前线程直到任务完成:
let foo () =
task {
printfn "Done."
}
let t = foo ()
t.Result
我预计大多数实际应用程序会有很多 do!
和 let!
语句,但只有少数 .Result
调用以避免阻塞。