delegate TResult MethodCaller<T1, T2, TResult>(T1 arg1, T2 arg2);
public static void Main(string[] args)
MethodCaller<int, int, int> funcDelegate = DoWork;
IAsyncResult asyncResult = funcDelegate.BeginInvoke(30, 20, null, null);
Console.WriteLine($"Main thread {Thread.CurrentThread.ManagedThreadId} does some work.");
Thread.Sleep(TimeSpan.FromSeconds(2));
int result = funcDelegate.EndInvoke(asyncResult);
Console.WriteLine($"DoWork(30, 20) returned {result}");
static int DoWork(int num1, int num2)
Console.WriteLine($"Test method begins in thread {Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(TimeSpan.FromSeconds(3));