제대로 기다리지 않는 이유를 알 수없는 문제가 있습니다. 작업이 완료되지 않았는데도 완료되기까지 실행 중입니다.
내가 다음과 같습니다 asyncronous입니다 재귀 파일 복사가 : 디버거를 실행하는 경우public async Task CopyFiles(string source, string destination)
{
if (!Directory.Exists(destination))
{
Directory.CreateDirectory(destination);
}
var info = new DirectoryInfo(source);
foreach (var file in info.EnumerateFiles())
{
Progress.Report(new Counter { Files = 1, FileSize = file.Length, Log = $"Copying file {file.Name}" });
try
{
var newpath = Path.Combine(destination, file.Name);
if (File.Exists(newpath) && File.GetLastWriteTime(newpath) == file.LastWriteTime)
{
continue;
}
using (FileStream reader = new FileStream(file.FullName, FileMode.Open, FileAccess.Read))
{
using (FileStream writer = new FileStream(newpath, FileMode.Create, FileAccess.ReadWrite))
{
await reader.CopyToAsync(writer);
}
}
File.SetLastAccessTime(newpath, file.LastAccessTime);
File.SetLastWriteTime(newpath, file.LastWriteTime);
File.SetAttributes(newpath, file.Attributes);
}
catch
{
}
}
foreach (var directory in info.EnumerateDirectories())
{
try
{
await CopyFiles(directory.FullName, $"{destination}\\{directory.Name}");
}
catch
{
}
}
이 방법은
private async Task RestoreFiles()
{
var progress = GetProgressReporter();
var recursion = new Recursion(progress, Environment.GetFolderPath(Environment.SpecialFolder.UserProfile));
await recursion.CopyFiles(@"\\800CRBackup\Backups\Profiles\Beta\" + $"{Environment.UserName}", Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)));
ResetStats();
}
프리즘에 DelegateCommand로 호출을, 그것은 작업 믿고 완료까지 달했다. 그러나이 방법의 진행 기자는 복사 할 남은 전체 파일을 ViewModel에 바인딩하기 때문에이 경우에는 해당되지 않습니다.
ResetStats 방법은 파일이 남아있는 크기가 남은 현재 로그 0
에 그러나이 작업이 완료 말했다 불구하고 재귀 복사가 여전히도 발생하기 때문에 설정, 그것은 음수로 가서 내 UI 원인 .
나를 고칠 수있는 유일한 방법은 재귀를 Task.Run으로 래핑하는 것이지만, 그 시점에서 비동기 적으로 수행하려고하는 것은 아닙니다.
여기서 일어나는 일은 이벤트 처리기에서 비동기 void와 관련이 있지만 명령이 void 인 경우 해결 방법을 모르겠다.
catch에서 처리하지 않는 오류가 있습니까? 이 경우 비동기로 수행해야 할 작업이 많지 않습니다. 응용 프로그램의 속도가 느려지는 것은 높은 동시성을 처리하지 않기 때문입니다. –
디렉토리를 만들 권한이 없으면 코드는 아무 것도하지 않습니다. – jdweng
작업이 예외없이 완료되었으므로 try catch 블록을 사용하여 예외를 throw하고 아무 것도 잡히지 않았습니다. – Ambidex