C# -Four Patterns in Asynchronous execution

前端 未结 3 2000
终归单人心
终归单人心 2020-12-04 06:08

I heard that there are four patterns in asynchronous execution.

There are four patterns in async delegate execution: Polling, Waiting for Completion,

相关标签:
3条回答
  • 2020-12-04 06:47

    What you have there is the Polling pattern. In this pattern you continually ask "Are we there yet?" The while loop is doing the blocking. The Thread.Sleep prevents the process from eating up CPU cycles.


    Wait for Completion is the "I'll call you" approach.

    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...");
    

    So as soon as WaitOne is called you are blocking until climbing is complete. You can perform other tasks before blocking.


    With Completion Notification you are saying "You call me, I won't call you."

    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...");
    }
    

    There is no blocking here because Callback is going to be notified.


    And fire and forget would be

    data.BeginInvoke(null, null);
    //don't care about result
    

    There is also no blocking here because you don't care when climbing is finished. As the name suggests, you forget about it. You are saying "Don't call me, I won't call you, but still, don't call me."

    0 讨论(0)
  • 2020-12-04 06:49
    while (!ar.IsCompleted)
    {
        Console.WriteLine("...Climbing yet to be completed.....");
        Thread.Sleep(200);
    }
    

    That's classic polling. - Check, sleep, check again,

    0 讨论(0)
  • 2020-12-04 06:53

    This code is Polling:

    while (!ar.IsCompleted)
    

    That's the key, you keep checking whether or not it's completed.

    THis code doesn't really support all four, but some code does.

    Process fileProcess = new Process();
    // Fill the start info
    bool started = fileProcess.Start();
    

    The "Start" method is Asynchronous. It spawns a new process.

    We could do each of the ways you request with this code:

    // 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();
    
    0 讨论(0)
提交回复
热议问题