Fortsätt till huvudinnehåll

Async Delegate BeginInvoke Callback Example

I found it hard to find a straight forward example of Asynchronous invocation of a delegate using BeginInvoke and a callback that is called when the delegate is completed. So I wrote one myself.

1:  using System;  
2:  using System.Runtime.Remoting.Messaging;  
3:  using System.Threading;  
4:    
5:  namespace AsyncDelegates  
6:  {  
7:    public delegate int Add(int a, int b);  
8:    
9:    class Program  
10:    {  
11:      private static volatile bool isCalculating;  
12:    
13:      static void Main(string[] args)  
14:      {  
15:        Console.WriteLine($"Main() running on thread {Thread.CurrentThread.ManagedThreadId}");  
16:        var theDelegate = new Add(Adder);  
17:        isCalculating = true;  
18:        theDelegate.BeginInvoke(7, 5, AdderCallback, null); // Runs the Add method on a separate thread. Calls AdderCallback when Add has finished.  
19:        while (isCalculating) // The isCalculating boolean is set to false in the AdderCallback method.  
20:        {  
21:          Console.WriteLine("Working...");  
22:          Thread.Sleep(1000); // Avoid flooding the console.  
23:        }  
24:    
25:        Console.ReadLine();  
26:      }  
27:    
28:      private static int Adder(int a, int b)  
29:      {  
30:        Console.WriteLine($"Adder() running on thread {Thread.CurrentThread.ManagedThreadId}");  
31:        Thread.Sleep(5000); // Simulate some work.  
32:        return a + b;  
33:      }  
34:    
35:      private static void AdderCallback(IAsyncResult ar)  
36:      {  
37:        Console.WriteLine($"AdderCallback() running on thread {Thread.CurrentThread.ManagedThreadId}");  
38:        // Some casting is needed in order to be able to retrieve the output from the Add method.  
39:        var asyncResult = (AsyncResult)ar;  
40:        var theDelegate = (Add)asyncResult.AsyncDelegate;  
41:        int calculationResult = theDelegate.EndInvoke(ar); // Retrieves the result and ends the delegate invocation  
42:        Console.WriteLine($"The result of the Add was {calculationResult}");  
43:        isCalculating = false;  
44:      }  
45:    }  
46:  }  
47:    

Kommentarer