Я использую этот код для записи группы файлов на диск:
var savingTasks = games.Games.Select(t=>{
var path = Path.ChangeExtension(Path.Combine(savePath,Path.GetFileName(t.Url)),"pgn");
Log.Information($"trying to save game in:{path}");
var fs = new FileStream(path,FileMode.CreateNew,FileAccess.ReadWrite);
opened.Add(fs);
var sr = new StreamWriter(fs);
writers.Add(sr);
var tsk = sr.WriteAsync(t.Pgn);
return tsk;
});
try
{
await Task.WhenAll(savingTasks);
var flushing = writers.Select(u=>u.FlushAsync());
await Task.WhenAll(flushing);
}
catch(Exception e)
{
Log.Fatal($"Cannot write to file:{e}");
throw e;
}
finally
{
opened.ForEach(s => s.Close());
}
В некоторых шагах я не уверен, что у меня все получается лучше, даже если код работает просто хорошо. Часть, которая не убеждает меня в том, как я справляюсь с закрытием: я создал группу задач в Select
, но мне пришлось следить за открытым файлом, чтобы закрыть их (см. Наконец), и аналогичным образом, Мне пришлось управлять коллекцией StreamWriter
(см. writers
). Это меня не убеждает, есть ли лучший подход?