Мой код в порядке, но мне интересно, какой стиль лучше, как вы увидите, я играю с асинхронными методами.
Позвольте мне установить контекст:
Parallel.ForEach(xmlAnimalList, async xml =>
{
taskList.Add(await Task.FromResult(ReadAnimalXML(xml, token)));
});
этот фрагмент кода работает очень хорошо с этим методом:
public async Task<Animal> ReadAnimalXML(string filename, CancellationToken token)
В предыдущем примере вы можете увидеть Task.FromResult () сразу после ключевого слова await.Метод ReadAnimalXML возвращает только:
return new Animal();
Второй пример:
Parallel.ForEach(xmlAnimalList, async xml =>
{
taskList.Add(await ReadAnimalXML2(xml, token));
});
на этот раз метод ReadAnimalXML2 возвращает это:
public async Task<Task<Animal>> ReadAnimalXML2(string filename, CancellationToken token)
{
return Task.FromResult(new Animal());
}
НО!
Второй метод ReadAnimalXML2 (который мне кажется действительно странным) возвращает
Task<Task<Animal>>
Задача внутри задачи.
Вот почему я возвращаю Task.FromResult (new Animal ()); , иначе он не будет работать.Оба способа хороши, но один лучше. Не могли бы вы поделиться своим ответом и объяснить, почему?
Я благодарю вас за то, что вы вошли, чтобы увидеть вопрос. Кодировка ЗАБЫВАЛА!
public async Task<IEnumerable<Animal>> ReadXMLFromFolderAsync(string folderPath, CancellationToken token)
{
if (!Directory.Exists(folderPath))
{
return new List<Animal>();
}
List<Task<Animal>> taskList = new List<Task<Animal>>();
List<string> xmlAnimalList = Directory.GetFiles(folderPath, "*.xml").ToList();
Parallel.ForEach(xmlAnimalList, async xml =>
{
taskList.Add(await Task.FromResult(ReadAnimalXML(xml, token)));
});
return await Task.WhenAll(taskList);
}
public async Task<Animal> ReadAnimalXML(string filename, CancellationToken token)
{
XDocument document = XDocument.Load(filename);
IEnumerable<XElement> ADN = await Task.Run(() =>
document.Descendants("ADN").Where(adn => adn.Name.LocalName == "Dinosaur"), token);
//populate the animal object
return new Animal();
}
public async Task<IEnumerable<Animal>> ReadXMLFromFolderAsync2(string folderPath, CancellationToken token)
{
if (!Directory.Exists(folderPath))
{
return new List<Animal>();
}
List<Task<Animal>> taskList = new List<Task<Animal>>();
List<string> xmlAnimalList = Directory.GetFiles(folderPath, "*.xml").ToList();
Parallel.ForEach(xmlAnimalList, async xml =>
{
taskList.Add(await ReadAnimalXML2(xml, token));
});
return await Task.WhenAll(taskList);
}
public async Task<Task<Animal>> ReadAnimalXML2(string filename, CancellationToken token)
{
XDocument document = XDocument.Load(filename);
IEnumerable<XElement> ADN = await Task.Run(() => document
.Descendants("ADN")
.Where(adn => adn
.Name
.LocalName == "Dinosaur")
, token);
//populate the animal object
return Task.FromResult(new Animal());
}