つの質問:ログの正しい方法
- 非同期メソッドの実装この実装でありますか?
これは、ファイルの削除中に表示される可能性のある例外を記録する正しい実装ですか?
public static async Task DeleteFiles(StorageFolder folder, Regex mask, LoggingChannel logger) { var results = (from file in await folder.GetFilesAsync() where mask.IsMatch(file.Name) select file).Select(async f => await f.DeleteAsync()); await Task.WhenAll(results); foreach (var failed in results.Where(r => r.Exception != null)) logger.LogMessage(failed.Exception.ToString(), LoggingLevel.Warning); }
それは(右?)良い方法です:
public static async Task DeleteFiles(StorageFolder folder, Regex mask, LoggingChannel logger)
{
foreach(var f in (await folder.GetFilesAsync()).Where(f => mask.IsMatch(f.Name)))
{
try
{
await f.DeleteAsync();
}
catch(Exception ex)
{
logger.LogMessage(ex.ToString(), LoggingLevel.Warning);
}
}
}
「catch」句はどこですか? 'async/await'は、コードが同期コードのように動作することを意味します。つまり、例外を発生させます。このコードは、最初のエラー –
でクラッシュするだけです。また、削除を実行するために 'Select'節を使用するのは非常に良い設計ではありません。 –
@Panagiotis Kanavos私の考えは、私の結果クエリが列挙<タスク>を返し、その後、私はすべてのタスクの完了を待ってから、私は本当の例外が含まれているだけIAsyncActionエンティティを取り、それらをログに記録していました。しかし、ここに私の2つの脅しがあります。そのような実装は非同期ではなく、私はタスクがどちらかのエラーで終了するという前提でリレーします。 Msdnヘルプdoesnotここで明確に例外を指定しません。https://msdn.microsoft.com/en-us/library/windows/apps/br227201.aspx –