問題が発生して、なぜそれが正しく待ち受けていないように見えていないようです。タスクが完了していないにもかかわらず、完了しています。
私は以下のようになりた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であるためどのように解決するかはわかりません。
キャッチで処理していないエラーが発生していますか?この場合、非同期で多くのことを達成することはできません。高い同時実行性を扱っていないので、おそらくアプリケーションが減速することになります。 –
ディレクトリを作成する権限がない場合、コードは何も行いません。 – jdweng
タスクは例外なしで完了し、私は例外をスローするtry catchブロックで囲み、同様に何も捕まえられませんでした。 – Ambidex