2017-11-10 6 views
-2

제대로 기다리지 않는 이유를 알 수없는 문제가 있습니다. 작업이 완료되지 않았는데도 완료되기까지 실행 중입니다.

내가 다음과 같습니다 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 인 경우 해결 방법을 모르겠다.

+0

catch에서 처리하지 않는 오류가 있습니까? 이 경우 비동기로 수행해야 할 작업이 많지 않습니다. 응용 프로그램의 속도가 느려지는 것은 높은 동시성을 처리하지 않기 때문입니다. –

+0

디렉토리를 만들 권한이 없으면 코드는 아무 것도하지 않습니다. – jdweng

+0

작업이 예외없이 완료되었으므로 try catch 블록을 사용하여 예외를 throw하고 아무 것도 잡히지 않았습니다. – Ambidex

답변

1

IProgress가 UI를 새로 고쳐서 UI 스레드를 차단하여 제대로 작동하지 않을 수 있다는 문제점이있었습니다. 결과가 지연된 후에 문제가 해결되었습니다.

반창고 수정과 달리 타이머 또는 반응 방식을 사용해야합니다.