Почему код ниже результатов в:Почему .NET async ждет копию файла намного больше, чем процессор, чем синхронный вызов File.Copy()?
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 намного меньше процессора затрат:
Так есть еще реальный интерес, использующий async/ожидание для копирования файлов?
Я думал, что сохранение потока для копирования может стоить того, но функция File.Copy windows, похоже, выиграла битву с точки зрения CPU%. Некоторые утверждают, что это из-за реальной поддержки DMA, но все же я делаю что-нибудь, чтобы испортить выступления? Или есть что-то, что можно сделать для улучшения использования ЦП с помощью метода async?
Быстрее ли это? – Steve
@ Попробуйте не намного быстрее, немного, я все еще больше обеспокоен CPU%, что выглядит страшно. – Ehouarn
Вероятно, это связано с различием между некоторыми способами, которые «File.Copy» реализуется в сравнении с вашим прямым потоковым использованием «File.OpenRead» и «File.OpenWrite». Я сомневаюсь, что это имеет какое-то отношение к синхронизации по сравнению с асинхронным. – Abion47