次のようなコードがあります。
abstract class Data
{
Data(string name, bool load) { if (load) { Load().Wait(); }
abstract Task Load();
}
class XmlData : Data
{
XmlData(string name, bool load = true) : base(name, load) {}
override async Task Load()
{
var file = await GetFileAsync(...);
var xmlDoc = await LoadXmlDocAsync(file);
ProcessXml(xmlDoc);
}
void ProcessXml(XmlDocument xmlDoc)
{
foreach (var element in xmlDoc.Nodes)
{
if (element.NodeName == "something")
new XmlData(element.NodeText);
}
}
}
GetFileAsync(...) でコードがハングしてしまうという奇妙なタイミングの問題が (時々) 発生するようです。これは、呼び出しの再帰的な性質が原因ですか? すべての await 呼び出しを実際に .Wait() を実行して終了するように変更し、本質的に呼び出しのすべての非同期性を取り除くと、私のコードは正常に実行されます。