2017-11-10 7 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と呼ばれています完了まで走った。ただし、この方法のProgressレポータは、ViewModelにバインドされている残りの残りの合計ファイルを減算するため、このようには見えません。

ResetStats方法は0

にファイル残り、サイズ残りと現在のログを設定します。しかし、再帰的なコピーはまだそれは、タスクが完了したにも関わらず発生していることから、それは負の数に行くために私のUIを引き起こし。

私が修正する唯一の方法は、再帰をTask.Runにラップすることですが、その時点で非同期的にそれをやろうとしていることはありません。

ここで起こっていることは、イベントハンドラからの非同期voidとは関係がありますが、コマンドがvoidであるためどのように解決するかはわかりません。

+0

キャッチで処理していないエラーが発生していますか?この場合、非同期で多くのことを達成することはできません。高い同時実行性を扱っていないので、おそらくアプリケーションが減速することになります。 –

+0

ディレクトリを作成する権限がない場合、コードは何も行いません。 – jdweng

+0

タスクは例外なしで完了し、私は例外をスローするtry catchブロックで囲み、同様に何も捕まえられませんでした。 – Ambidex

答えて

1

IProgressがUIをリフレッシュしていて、UIスレッドをブロックしているため、待機が正しく機能しないという問題がありました。結果の後に遅延を追加すると問題が解決されました。

Band-Aid修正とは対照的に、タイマーまたはリアクティブメソッドを使用して修正する必要があります。

関連する問題