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
Skicka en kommentar