デリゲートがメソッドが起動する前にEndInvokeを呼び出す必要があるのはなぜですか? EndInvoke(スレッドをブロックする)を呼び出す必要がある場合、実際には非同期呼び出しではありませんか?非同期デリゲートメソッドでEndInvokeを呼び出す必要があるのはなぜですか?
ここに実行しようとしているコードです。
class Program
{
private delegate void GenerateXmlDelegate();
static void Main(string[] args)
{
GenerateXmlDelegate worker = new GenerateXmlDelegate(GenerateMainXml);
IAsyncResult result = worker.BeginInvoke(null, null);
}
private static void GenerateMainXml()
{
Thread.Sleep(10000);
Console.WriteLine("GenerateMainXml Called by delegate");
}
}
私の例を拡張して、Completion Handlerの意味を実証することはできますか?私が読んだすべての記事から、BeginInvokeを呼び出すだけでメソッド呼び出しが呼び出されることが示唆されています。 –
これはちょうど正しいです - メモリリークは発生しません。 https://gist.github.com/jcdickinson/9109599。しかし、ある種のシナリオでは、 'Begin/End-Invoke'ペアで追跡するものがあります。例えば、' Socket'オペレーションで 'End *'を呼び出さなければ、あなたのソケットパフォーマンスカウンターは完全に駄目になりますメモリリークがない場合、値はまったく間違っています)。 –