44

非同期実行には4つのパターンがあると聞きました。

非同期デリゲートの実行には、ポーリング、完了の待機、完了通知、および「ファイアアンドフォーゲット」の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)コードを説明できますか、残りをどのように実装できますか..?

4

3 に答える 3

99

そこにあるのはポーリングパターンです。このパターンでは、「まだそこにいますか?」と継続的に尋ねます。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

登山が終わっても気にしないので、ここでも閉塞はありません。その名の通り、忘れがちです。あなたは「私に電話しないでください、私はあなたに電話しませんが、それでも私に電話しないでください」と言っています。

于 2009-11-23T18:20:49.760 に答える
4
while (!ar.IsCompleted)
{
    Console.WriteLine("...Climbing yet to be completed.....");
    Thread.Sleep(200);
}

それは古典的な投票です。- チェックして、スリープして、もう一度チェックして、

于 2009-11-23T18:20:22.977 に答える
2

このコードはポーリングです:

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();
于 2009-11-23T18:19:26.317 に答える