廢話不多說,直接上代碼(PS:我就喜歡簡單、直接、粗暴)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace 異步調用委托
{
class Program
{
static void Main(string[] args)
{
MyDelegate md = new MyDelegate(sum);
#region 一般的程序調用
//int s = md(1, 20);
//Console.WriteLine("Sum is: {0}", s);
#endregion
#region 直接通過調用異步委拖獲取返回值,會阻塞主線程
// 開始執行異步調用,使用了線程池,為線程
//IAsyncResult res = md.BeginInvoke(1,30,null,"test");
//// 在這裡可以進行其它操作
//Console.WriteLine("在這裡可以進行其它操作的哦~");
//// 這種方式獲取返回值會中斷主線程的執行
//int s = md.EndInvoke(res);
//Console.WriteLine("Sum is: {0}", s);
#endregion
#region 通過回調函數實現異步委托返回值,不阻塞主線程
IAsyncResult res = md.BeginInvoke(1, 30, CallBack, "Test");
#endregion
//子線程你慢慢玩,我一邊等你,一邊做點事,你做玩完就一起回家
int i = 0;
while (!res.IsCompleted)
{
Console.WriteLine("主線程繼續執行..." + (i++ % 100).ToString());
System.Threading.Thread.Sleep(100);
}
Console.ReadKey();
}
// 實際的計算方法 - 假設非常耗時
private static int sum(int fromNum, int toNum)
{
int sum = 0;
for (int i = fromNum; i < toNum; i++)
{
sum++;
Thread.Sleep(100);
}
return sum;
}
// 回調函數,即當線程異步結束以後調用此方法
private static void CallBack(IAsyncResult ar)
{
AsyncResult AR = ar as AsyncResult;
Console.WriteLine("異步調用的回調參數為{0}", AR.AsyncState); //獲得並輸出異步調用的結果
int s = ((MyDelegate)AR.AsyncDelegate).EndInvoke(ar);
Console.WriteLine("Sum is: {0}", s);
}
}
// 聲明委托
public delegate int MyDelegate(int fromNum, int toNum);
}
來源:http://www.cnblogs.com/nero-lee/archive/2017/01/06/6257243.html