非同期実行には4つのパターンがあると聞きました。
非同期デリゲートの実行には、ポーリング、完了待ち、完了通知、および「Fire and Forget」の4つのパターンがあります。
次のコードがある場合:
class AsynchronousDemo
{
public static int numberofFeets = 0;
public delegate long StatisticalData();
static void Main()
{
StatisticalData data = ClimbSmallHill;
IAsyncResult ar = data.BeginInvoke(null, null);
while (!ar.IsCompleted)
{
Console.WriteLine("...Climbing yet to be completed.....");
Thread.Sleep(200);
}
Console.WriteLine("..Climbing is completed...");
Console.WriteLine("... Time Taken for climbing ....{0}",
data.EndInvoke(ar).ToString()+"..Seconds");
Console.ReadKey(true);
}
static long ClimbSmallHill()
{
var sw = Stopwatch.StartNew();
while (numberofFeets <= 10000)
{
numberofFeets = numberofFeets + 100;
Thread.Sleep(10);
}
sw.Stop();
return sw.ElapsedMilliseconds;
}
}
1)上記のコードが実装するパターンは何ですか?
2)コードを説明できますか、残りをどのように実装できますか?
そこにあるのは、ポーリングパターンです。このパターンでは、「まだそこにいますか?」 while
ループがブロッキングを実行しています。 Thread.Sleep
は、プロセスがCPUサイクルを使い果たすのを防ぎます。
完了を待つことは、「電話します」というアプローチです。
IAsyncResult ar = data.BeginInvoke(null, null);
//wait until processing is done with WaitOne
//you can do other actions before this if needed
ar.AsyncWaitHandle.WaitOne();
Console.WriteLine("..Climbing is completed...");
したがって、WaitOne
が呼び出されるとすぐに、クライミングが完了するまでブロックします。ブロックする前に他のタスクを実行できます。
完了通知では、「あなたは私に電話します、私はあなたに電話しません」と言っています。
IAsyncResult ar = data.BeginInvoke(Callback, null);
//Automatically gets called after climbing is complete because we specified this
//in the call to BeginInvoke
public static void Callback(IAsyncResult result) {
Console.WriteLine("..Climbing is completed...");
}
Callback
に通知されるため、ここにはブロックはありません。
そして、火と忘れるだろう
data.BeginInvoke(null, null);
//don't care about result
登山が終了しても気にしないので、ここにはブロックもありません。名前が示すように、あなたはそれを忘れます。あなたは「私に電話しないで、あなたに電話しませんが、それでも私に電話しないでください」と言っています。
while (!ar.IsCompleted)
{
Console.WriteLine("...Climbing yet to be completed.....");
Thread.Sleep(200);
}
それは古典的なポーリングです。 -チェック、スリープ、もう一度チェック、
このコードはポーリングです:
while (!ar.IsCompleted)
それが鍵です、あなたはそれが完了したかどうかをチェックし続けます。
このコードは実際には4つすべてをサポートしていませんが、一部のコードはサポートしています。
Process fileProcess = new Process();
// Fill the start info
bool started = fileProcess.Start();
「開始」メソッドは非同期です。新しいプロセスが生成されます。
このコードを使用して、リクエストする各方法を実行できます。
// Fire and forget
// We don't do anything, because we've started the process, and we don't care about it
// Completion Notification
fileProcess.Exited += new EventHandler(fileProcess_Exited);
// Polling
while (fileProcess.HasExited)
{
}
// Wait for completion
fileProcess.WaitForExit();