异步调用

异步调用由BeginInvoke()开始和由EndInvoke()结束。

BeginInvoke(args0, args1,……, argsn, AsyncCallback callback, Object object)

args0,……,argsn表示的是要执行方法的参数

callback,是AsyncCallback委托,表示的是在异步调用要结束的时调用的方法。

object,是用户定义的对象,该对象将消息传入回调的方法。

其中callbackobject是可选的参数。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);

}

       }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值