![.NET async file copy](https://istack.dev59.com/FuuFC.webp)
public static class Program
{
public static void Main(params string[] args)
{
var sourceFileName = @"C:\Users\ehoua\Desktop\Stuff\800MFile.exe";
var destinationFileName = sourceFileName + ".bak";
FileCopyAsync(sourceFileName, destinationFileName);
// The line below is actually faster and a lot less CPU-consuming
// File.Copy(sourceFileName, destinationFileName, true);
Console.ReadKey();
}
public static async void FileCopyAsync(string sourceFileName, string destinationFileName, int bufferSize = 0x1000, CancellationToken cancellationToken = default(CancellationToken))
{
using (var sourceFile = File.OpenRead(sourceFileName))
{
using (var destinationFile = File.OpenWrite(destinationFileName))
{
Console.WriteLine($"Copying {sourceFileName} to {destinationFileName}...");
await sourceFile.CopyToAsync(destinationFile, bufferSize, cancellationToken);
Console.WriteLine("Done");
}
}
}
}
在使用File.Copy()时,https://msdn.microsoft.com/en-us/library/system.io.file.copy(v=vs.110).aspx的CPU消耗要少得多:
![同步文件复制](https://istack.dev59.com/e1s5y.webp)
我认为节省线程用于复制可能是值得的,但是File.Copy函数似乎在CPU%方面轻松获胜。 有人会认为这是因为硬件支持了真正的DMA,但是,我是否做了任何事情来破坏性能?或者是否有任何可以改进我的异步方法的CPU使用率的方法?
File.Copy
实现的某些底层方式与您直接使用File.OpenRead
和File.OpenWrite
的流式方法之间的差异有关。我怀疑这与同步与异步无关。 - Abion47File.Copy
,它封装了本机Win32操作,采用更低层次的方法。请参见https://dev59.com/yHM_5IYBdhLWcg3wvV5w。 - Abion47