异步编程
如果委托对象在调用列表中只有一个方法(引用方法),在调用委托类中的BeginInvoke方法时,它开始在一个独立的线程上执行引用方法,并且立即返回到原始线程。原始线程可以继续,而引用方法会在线程池中的线程中执行。
回调模式:
一旦原始线程发起了异步方法,它就自己管自己,不再考虑同步。当异步方法调用结束后,系统直接调用用户自定义的方法(回调方法)处理结果。
BeginInvoke的参数列表中的最后两个参数
第一: 回调方法(callback)
第二: state,可以回调方法传入一个对象的引用,通过IAsyncResult参数的AsyncState属性来获取这个对象。
以下代码演示如何使用这两个参数,来获取异步方法的结果
通过IAsyncResult.AsyncState提取委托的引用。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AsyncTestdf39
{
class Program
{
delegate long MyDel(int i1, int i2);
static void Main(string[] args)
{
MyDel del3 = new MyDel(Sum);
Console.WriteLine("before beginInvoke");
IAsyncResult iar2 = del3.BeginInvoke(90, 12, callWhenDone, del3);//将del3对象传给回调方法
Console.WriteLine("doing more work in main");
System.Threading.Thread.Sleep(200);
Console.WriteLine("done with Main , Exiting..");
Console.ReadLine();
}
static void callWhenDone(IAsyncResult iar)
{
Console.WriteLine(" inside CallWhenDone");
object de = iar.AsyncState;//获取委托对象的引用
MyDel deleg = (MyDel)de; //转换为委托类型
Console.WriteLine("result: {0}", deleg.EndInvoke(iar));
}
static long Sum(int i1, int i2)
{
Console.WriteLine(" inside Sum");
System.Threading.Thread.Sleep(100);
return i1 + i2;
}
}
}
运行结果
通过IAsyncResult提取委托的引用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Remoting.Messaging;//引用AsyncResult类命名空间
namespace AsyncTestdf39
{
class Program
{
delegate long MyDel(int i1, int i2);
static void Main(string[] args)
{
MyDel del3 = new MyDel(Sum);
Console.WriteLine("before beginInvoke");
IAsyncResult iar2 = del3.BeginInvoke(90, 12, callWhenDone, null);
// IAsyncResult iar2 = del3.BeginInvoke(90, 12, callWhenDone, del3);//将del3对象传给回调方法
Console.WriteLine("doing more work in main");
System.Threading.Thread.Sleep(200);
Console.WriteLine("done with Main , Exiting..");
Console.ReadLine();
}
static void callWhenDone(IAsyncResult iar)
{
Console.WriteLine(" inside CallWhenDone");
//object de = iar.AsyncState;//获取委托对象的引用
//MyDel deleg = (MyDel)de; //转换为委托类型
AsyncResult iads = (AsyncResult)iar;
MyDel deleg = (MyDel)iads.AsyncDelegate;//通过IAsyncResult提取委托的引用
Console.WriteLine("result: {0}", deleg.EndInvoke(iar));
}
static long Sum(int i1, int i2)
{
Console.WriteLine(" inside Sum");
System.Threading.Thread.Sleep(100);
return i1 + i2;
}
}
}
运行结果