程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#委托異步調用示例代碼

C#委托異步調用示例代碼

編輯:關於C#

廢話不多說,直接上代碼(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

  1. 上一頁:
  2. No
Copyright © 程式師世界 All Rights Reserved