私はこのような何かをするいくつかのコードを持っている:再帰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()を待っています。私は今、私にそれを持っていません。しかし、私が覚えている限り、何も実行されていませんでした。それはロードを待っていただけでしたが、他に何も起こっていないようでした。 –
@gamernbそうであれば、デッドロックがキャプチャされたコンテキストで待機することはほとんど保証されます。私の答えを見てください。 –
コンストラクタで仮想メソッドを呼び出すことは、一般的には悪い考えです(http:// stackoverflowを参照してください)。com/a/448272/224370など) –