我有一些代码,做这样的事情:递归的WinRT异步问题
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()来完成时,基本上摆脱了调用的所有异步性质,我的代码执行得很好。
当我连接调试器并中断时,它只是坐着等待Load.Wait()。我现在没有和我在一起。但据我记忆,没有其他任何执行。它只是在等待Load,但没有其他事情似乎正在进行。 – 2012-03-06 19:30:22
@gamernb如果是这样的话,这几乎可以保证在捕获的上下文中等待死锁。看到我的答案。 – 2012-03-06 19:31:46
在构造函数中调用虚拟方法通常是一个坏主意(请参阅http:// stackoverflow。com/a/448272/224370例如) – 2012-03-06 19:54:02