我有一些代码可以做这样的事情:
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(...) 上。这是由调用的递归性质引起的吗?当我将所有等待调用更改为实际执行 .Wait() 以使它们完成时,并且基本上摆脱了调用的所有异步性质,我的代码执行得很好。