C(※)委託の三種類の呼出例(同期呼出非同期呼出しの非同期コールバック)
まず、コードによって1つの依頼と以下の3つの例を定義すると呼び出される方法:
依頼されたInvokeメソッドは同期呼び出しに使用されます。同期呼び出しは、現在のスレッドをブロックし、呼び出しを実行し、呼び出しが完了したら、下に進みます。
非同期呼び出し
非同期呼び出しは、スレッドをブロックするのではなく、スレッドプールに呼び込み、プログラムマスタスレッドまたはUIスレッドを継続して実行することができる。委託の非同期呼び出しはBeginInvokeとEnd Invokeによって実現される。
非同期依頼は、以下のような書き方も参考にできます。
アクション
public delegate int AddHandler(int a,int b);
public class
{
public static int Add(int a, int b)
{
Console.WriteLine(" :" + a + "+" + b);
Thread.Sleep(3000); //
Console.WriteLine(" !");
return a + b;
}
}
同期コール依頼されたInvokeメソッドは同期呼び出しに使用されます。同期呼び出しは、現在のスレッドをブロックし、呼び出しを実行し、呼び出しが完了したら、下に進みます。
public class
{
static void Main()
{
Console.WriteLine("===== SyncInvokeTest =====");
AddHandler handler = new AddHandler( .Add);
int result = handler.Invoke(1, 2);
Console.WriteLine(" 。。。");
Console.WriteLine(result);
Console.ReadKey();
}
}
同期呼び出しはスレッドをブロックします。重い作業(例えば、大量のIO操作)を起動する場合、プログラムを長い間停止させ、悪いユーザー体験を引き起こす可能性があります。この場合、非同期呼び出しが必要です。非同期呼び出し
非同期呼び出しは、スレッドをブロックするのではなく、スレッドプールに呼び込み、プログラムマスタスレッドまたはUIスレッドを継続して実行することができる。委託の非同期呼び出しはBeginInvokeとEnd Invokeによって実現される。
public class
{
static void Main()
{
Console.WriteLine("===== AsyncInvokeTest =====");
AddHandler handler = new AddHandler( .Add);
//IAsyncResult: (interface)
//BeginInvoke: (delegate)
IAsyncResult result = handler.BeginInvoke(1, 2, null, null);
Console.WriteLine(" 。。。");
//
Console.WriteLine(handler.EndInvoke(result));
Console.ReadKey();
}
}
メインスレッドは待機していないが、そのまま下に向かって動作していることが分かります。しかし、問題は依然として存在しており、メインスレッドがEndInvokeに実行されている場合、起動が終了していない場合(この場合は発生する可能性があります)、呼出結果を待つためにスレッドがブロックされます。非同期依頼は、以下のような書き方も参考にできます。
アクション