gpt4 book ai didi

asynchronous - F# 异步文件复制

转载 作者:行者123 更新时间:2023-12-03 09:26:44 25 4
gpt4 key购买 nike

要异步复制文件,这样的方法行得通吗?

let filecopyasync (source, target) =
let task = Task.Run((fun () ->File.Copy(source, target, true)))

// do other stuff

Async.AwaitIAsyncResult task

特别是,这是否会在我“做其他事情”时启动一个新线程来进行复制?

更新:

找到另一个解决方案:

let asyncFileCopy (source, target, overwrite) =
printfn "Copying %s to %s" source target
let fn = new Func<string * string * bool, unit>(File.Copy)
Async.FromBeginEnd((source, target, overwrite), fn.BeginInvoke, fn.EndInvoke)

let copyfile1 = asyncFileCopy("file1", "file2", true)
let copyfile2 = asyncFileCopy("file3", "file4", true)

[copyfile1; copyfile2] |> seq |> Async.Parallel |> Async.RunSynchronously |> ignore

最佳答案

您的问题混淆了两个问题,即多线程和异步。重要的是要认识到这些东西是完全不同的概念:

异步是关于任务的工作流程,我们独立于主程序流程响应这些任务的完成。

多线程是一种执行模型,可以用来实现异步,尽管异步可以通过其他方式实现(例如硬件中断)。


现在,当谈到 I/O 时,您应该问的问题是“我可以启动另一个线程来为我做这件事吗?”

为什么,你问?

如果您在主线程中执行一些 I/O,您通常会阻塞主线程等待结果。如果你通过创建一个新线程来回避这个问题,你实际上并没有解决这个问题,你只是把它转移了。现在您已经阻塞了您创建的新线程或线程池线程。哦,天哪,同样的问题。

线程是一种昂贵且宝贵的资源,不应浪费在等待阻塞 I/O 完成上。

那么,真正的解决方案是什么?

好吧,我们通过这些其他方法之一实现异步。这样,我们可以请求操作系统执行一些 I/O,并请求它在 I/O 操作完成时通知我们。这样,在我们等待结果时线程不会被阻塞。在 Windows 中,这是通过称为 I/O 完成端口的东西实现的。


我如何在 F# 中执行此操作?

.NET CopyToAsync 方法可能是最简单的方法。由于这会返回一个简单的任务,因此创建一个辅助方法会很有帮助:

type Async with
static member AwaitPlainTask (task : Task) =
task.ContinueWith(ignore) |> Async.AwaitTask

然后

[<Literal>]
let DEFAULT_BUFFER_SIZE = 4096

let copyToAsync source dest =
async {
use sourceFile = new FileStream(source, FileMode.Open, FileAccess.Read, FileShare.Read, DEFAULT_BUFFER_SIZE, true);
use destFile = new FileStream(dest, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None, DEFAULT_BUFFER_SIZE, true);
do! sourceFile.CopyToAsync(destFile) |> Async.AwaitPlainTask
}

然后您可以将其与 Async.Parallel 一起使用以同时执行多个副本。

注意:这与您上面写的不同,因为 File.Copy 是一个同步方法,返回 unitCopyToAsync 是返回 Task 的异步方法。您不能通过在同步方法周围放置异步包装器来神奇地使同步方法异步,相反,您需要确保一直在使用异步。

关于asynchronous - F# 异步文件复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43209337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com