异步调用由BeginInvoke()开始和由EndInvoke()结束。
BeginInvoke(args0, args1,……, argsn, AsyncCallback callback, Object object):
args0,……,argsn表示的是要执行方法的参数
callback,是AsyncCallback委托,表示的是在异步调用要结束的时调用的方法。
object,是用户定义的对象,该对象将消息传入回调的方法。
其中callback,object是可选的参数。BeginInvoke会立即方法,但并不表示异步调用完成。BeginInvoke返回一个可用于监视异步进程的IAsyncResult对象。
EndInvoke(IAsyncResult result):检索异步调用的结果。在调用异步BeginInvoke之后可以随时调用。如果异步调用尚未完成,那么EndInvoke会一直阻止线程,直到异步完成。
WaitHandle:是等待对独占资源访问的操作系统的对象。从WaitHandle派生的类定义了信号传输机制,以指示资源的释放或者占用。在调用继承WaitHandle的方法,都是线程阻止的。
IAsyncResult:表示异步操作的状态。
IAsyncResult.AsyncState用于获取用户定义的对象。
IAsyncResult.AsyncWaitHandle
IAsyncResult.IsCompleted表示异步调用是否结束
AsyncCallback:引用在异步结束时回调的方法。
示例:
定义测试方法和调用委托
namespace Example.AsynchonousOperations
{
public class AsyncDemo
{
public string TestMethon(int callDuration, out int threadID)
{
Console.WriteLine(“Test method begins”);
Thread.Sleep(callDuration);
threadID = Thread.CurrentThread.ManagedThreadId;
return string.Format(“My call times was {0}”, callDuration);
}
}
public delegate string AsyncMethodCaller(int callDuration, out int threadID);
}
Demo1:使用EndInvoke()等待线程结束,使用时线程阻塞。
namespace Example.AsynchonousOperations
{
public class Program
{
static void Main()
{
AsyncDemo ad = new AsyncDemo();
AsyncMethodCaller caller = new AsyncMethodCaller(ad.TestMethod);
int threadID = 0;
IAsyncResult result = caller.BeginInvoke(3000, out threadID, null, null);
string resultStr = caller.EndInvoke(out threadID, result);
Console.WriteLine(“The call executed on thread {0}, with value was {1}.”, threadID, resultStr);
Console.ReadKey();
}
}
}
Demo2:使用WaitHandle等待线程结束
namespace Example.AsynchonousOperations
{
public class Program
{
static void Main()
{
AsyncDemo ad = new AsyncDemo();
AsyncMethodCaller caller = new AsyncMethodCaller(ad.TestMethod);
int threadID = 0;
IAsyncResult result = caller.BeginInvoke(3000, out threadID, null, null);
result.AsyncWaitHandle.WaitOne();
string resultStr = caller.EndInvoke(out threadID, result);
result.AsyncWaitHandle.Close();
Console.WriteLine(“The call executed on thread {0}, with value was {1}.”, threadID, resultStr);
Console.ReadKey();
}
}
}
Demo3:轮询异步调用完成
namespace Example.AsynchonousOperations
{
public class Program
{
static void Main()
{
AsyncDemo ad = new AsyncDemo();
AsyncMethodCaller caller = new AsyncMethodCaller(ad.TestMethod);
int threadID = 0;
IAsyncResult result = caller.BeginInvoke(3000, out threadID, null, null);
while( !result.IsCompleted )
{
Thread.Sleep(250);
Console.Write(“.”);
}
string resultStr = caller.EndInvoke(out threadID, result);
Console.WriteLine(“/nThe call executed on thread {0}, with value was {1}.”, threadID, resultStr);
Console.ReadKey();
}
}
}
Demo4:异步调用完成时执行方法
namespace Example.AsynchonousOperations
{
public class Program
{
static void Main()
{
AsyncDemo ad = new AsyncDemo();
AsyncMethodCaller caller = new AsyncMethodCaller(ad.TestMethod);
int threadID = 0;
IAsyncResult result = caller.BeginInvoke(3000, out threadID,
new AsyncCallback(CallbackMethod),
“The call executed on thread {0}, with value was {1}”);
Console.ReadKey();
}
static void CallbackMethod(IAsyncResult result)
{
AsyncResult ar = (AsyncResult)result;
AsyncMethodCaller caller = (AsyncMethodCaller)result.AsyncDelegate;
string format = ar.AsyncState;
int threadID = 0;
string resultStr = caller.EndInvoke(out threadID, result);
Console.WriteLine(format, threadID, resultStr);
}
}
}