您好,登錄后才能下訂單哦!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ComprehensiveTest.com
{
public class AsyCallEx112
{
// 定義一個執行加法的委托
public delegate int sum(int a, int b);
public class number
{
public int m = 4;
public int numberAdd(int a, int b)
{
int c = a + b;
return c;
}
//定義一個與。net framework 定義的asyncCallback委托相對應的回調函數
public void CallbackMothed2(IAsyncResult ar2)
{
//numberadd.BeginInvoke(21, 12, numberBack, numberadd); //第三個參數為回調
sum s = (sum)ar2.AsyncState;//獲得BeginInvoke第4個參數
int number = s.EndInvoke(ar2);//獲取運算的結果
m = number;
Console.WriteLine("得到的M值:{0}", m);
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ComprehensiveTest.com
{
public class AsyCallEx113
{
//定義一個委托
public delegate void AsyncEventHanlder();
public class Class1
{
public void Event1()
{
Console.WriteLine("Event1 start");
System.Threading.Thread.Sleep(2000);
Console.WriteLine("Event1 end");
}
public void Event2()
{
Console.WriteLine("Event2 start");
int i = 1;
while (i < 100)
{
i = i + 1;
Console.WriteLine("Event2 " + i.ToString());
}
Console.WriteLine("Event2 end");
}
public void CallbackMethod( IAsyncResult ar )
{
((AsyncEventHanlder)ar.AsyncState).EndInvoke(ar);
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ComprehensiveTest.com;
namespace ComprehensiveTest
{
class Program
{
static void Main(string[] args)
{
// 112
//AsyCallEx112.number num = new AsyCallEx112.number();
//AsyCallEx112.sum numberadd= new AsyCallEx112.sum(num.numberAdd);
//AsyncCallback numberBack = new AsyncCallback(num.CallbackMothed2);
//numberadd.BeginInvoke(21, 12, numberBack, numberadd);
//Console.WriteLine("得到的結果:");
//Console.WriteLine(num.m);
// 113
long start = 0;
long end = 0;
AsyCallEx113.Class1 c = new AsyCallEx113.Class1();
Console.WriteLine("ready");
start = DateTime.Now.Ticks;
AsyCallEx113.AsyncEventHanlder asy = new AsyCallEx113.AsyncEventHanlder(c.Event1);
//IAsyncResult ia = asy.BeginInvoke(null, null);
IAsyncResult ia = asy.BeginInvoke(new AsyncCallback(c.CallbackMethod), asy);
ia.AsyncWaitHandle.WaitOne(); //對c.Event1產生阻塞,既是等Event1全部執行完畢以后再往后面執行代碼(!important)
c.Event2();
end = DateTime.Now.Ticks;
Console.WriteLine("時間刻度差= " + Convert.ToString(end - start));
Console.ReadLine();
}
}
}
不知道是什么原因 , 有的時候 , 沒法打中文 , 在這個編輯器里面 . 不過現在又好了,,,
廢話少說 , 進入正題了
1 , 這個異步調用( CallBack ) 于 傳統的callback的區別 , 就是1個在于異步 , 一個在于同步.當然C#異步調用有方法是其變為同步調用 . 如果讀者現在不明白何為同步 , 何為異步 , 請找度娘 ......
過程如下 :
①:BeginInvoke方法啟動異步調用 , 委托實例的方法 , 參數( n個回調參數 , 實例AsyncCallback , 委托實例本身 ) . 其中 : 關于AsyncCallback 的參數是有IAsyncResult的Function
②:EndInvoke檢索異步調用的結果 , 就是得到委托運算的結果
使用WaitHandle等待異步調用
就是產生與傳統Callback一樣的效果 , 即產生阻塞 , 等待異步調用全部完成 , 進行下面的運行
由BeginInvoke 產生的IAsyncResult ( IAsynResult.AsyncWaitHandle.WaitOne() )
請 , 參照上面的代碼 , 學習!!!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。