使用 IAsyncResult 调用异步方法 2. 使用委托进行异步编程 3. 使用事件进行异步多线程编程 注: IAsyncResult 方式通常是用委托来实现的。...http://msdn.microsoft.com/zh-cn/library/2e08f6yc.aspx 使用 IAsyncResult 调用异步方法 1....IAsyncResult 对象中存储有关异步操作的信息。 3. 阻止应用程序执行的几种方法 a....在BeingXXX()之后调用 IAsyncResult.AsyncWAitHandle 中的相应方法也可以阻止调用线程。...在BeingXXX()之后调轮询IAsyncResult.IsCompleted属性来确定此操作是否已完成 IAsyncResult result = AsyncDemo.BeginRun(param1
BeginClose(AsyncCallback callback, object state); 13: IAsyncResult BeginClose(TimeSpan timeout..., AsyncCallback callback, object state); 14: IAsyncResult BeginOpen(AsyncCallback callback, object...state); 15: IAsyncResult BeginOpen(TimeSpan timeout, AsyncCallback callback, object state);...callback, object state); 7: IAsyncResult BeginWaitForMessage(TimeSpan timeout, AsyncCallback...(IAsyncResult result, out Message message); 10: bool EndWaitForMessage(IAsyncResult result);
b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState...`1.End() 在 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult...(IAsyncResult asyncResult) 在 System.Web.Mvc.MvcHandler....b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState...(IAsyncResult asyncResult) 在 System.Web.Mvc.MvcHandler.
callback, object state); 15: void EndOpen(IAsyncResult result); 16: 17: void Close();...18: void Close(TimeSpan timeout); 19: IAsyncResult BeginClose(AsyncCallback callback, object...state); 20: IAsyncResult BeginClose(TimeSpan timeout, AsyncCallback callback, object state); 21...: void EndClose(IAsyncResult result); 22: 23: void Abort(); 24: 25: // Properties...BeginOpen(AsyncCallback callback, object state); 6: IAsyncResult BeginOpen(TimeSpan timeout,
BeginAsyncOperation), new EndEventHandler (EndAsyncOperation) ); } IAsyncResult...connection); return _command.BeginExecuteReader (cb, state); } void EndAsyncOperation(IAsyncResult...), new EndEventHandler(EndAsyncOperation) ); } } IAsyncResult...TimeoutAsyncOperation), null ); RegisterAsyncTask(task); } IAsyncResult...); } Output.Text = builder.ToString(); } void TimeoutAsyncOperation(IAsyncResult
IDiscoveryContractManagedCD1, ... 12: { 13: //Find(Probe) 14: protected abstract IAsyncResult...result); 16: 17: //Resolve 18: protected abstract IAsyncResult OnBeginResolve(ResolveCriteria...由于我们要重写的方法都是异步模式的,OnBeginXxx的输出和OnEndXxx的输入都是一个IAsyncResult类型的对象,所以我们先要定义一个实现IAsyncResult接口的类型。...result) {} 30: 31: //Resolve 32: protected override IAsyncResult OnBeginResolve...result) {} 54: 55: //OfflineAnnouncement 56: protected override IAsyncResult
异步编程模型 (APM) 模式(也称为 IAsyncResult 模式),这是使用 IAsyncResult 接口提供异步行为的旧模型。...可以通过 IAsyncResult 设计模式的 Begin 和 End 方法来实现,其中 Begin 方法开始异步操作,而 End 方法在异步操作完成时执行,并返回异步操作的结果。...需要注意的是,APM 模式通过 IAsyncResult 接口来存储异步操作的状态和结果,相对比较复杂,代码量也较大。...param> /// state /// public IAsyncResult...result) { // 将 IAsyncResult 转换为 MyAsyncResult 类型,并等待异步操作完成 MyAsyncResult
使用带返回值的Func开启的线程检测: Func f = MyThread; IAsyncResult...ar=f.BeginInvoke(3,"str参数",null,null); func对象的BeginInvoke方法会返回IAsyncResult类型的对象,此对象的IsCompleted...通过等待句柄检测委托线程的结束; Func fu = MyThread; IAsyncResult iAr = f.BeginInvoke...通过回调函数检测; Func fu = MyThread; IAsyncResult iAr = fu.BeginInvoke...; //倒数第一个参数给回调函数传递数据参数 static void OnCallBack(IAsyncResult iar) //回调函数
但是按钮根本就显示不出来 DoThingsDelegate dothingsEvent = new DoThingsDelegate(DoSomeThing); IAsyncResult... //同步委托就更不行了 dothingsEvent.Invoke(); //真正的异步委托 异步调用方法,与多线程相似 IAsyncResult...Thread.Sleep(6000); Console.WriteLine("end"); } public static void DoThingEnd(IAsyncResult
在代码3中出现了IAsyncResult接口,这是异步状态接口,什么意思呢。就是IAsyncResult持有对异步操作过程中的状态的引用。...图1: 通过这张图能看见IAsyncResult为什么能清楚线程在做什么。我们继续。...由于IAsyncResult接口保存着对异步线程的执行状态,所以我们能通过IAsyncResult接口判断线程是否已经执行完毕。...都需要自己去实现IAsyncResult接口来达到在异步的情况下传递的消息。 有了异步调用当然需要再适当的时候获取执行的结果了。...其实还有一个比较重要的东西就是BeginInvoke方法中的最后一个参数,其实该参数是用来传递回调方法的参数的,由于回调方法的签名是不能变的,只能是用IAsyncResult接口作为参数,所以我们只能通过
MyCalulator objMycal = ExecuteTask1;//定义委托变量,并引用对应方法 //1.异步调用任务 实际调用参数 回调函数 回调函数入参 IAsyncResult...MyCalulator objMycal = ExecuteTask1;//定义委托变量,并引用对应方法 //1.异步调用任务 实际调用参数 回调函数 回调函数入参 IAsyncResult...this.label1.Text = r.ToString(); } 编写异步方法的流程在注释里都写出来了,下来重点介绍下其中的几个方法 BeginInvoke函数 IAsyncResult...ayncState)方法 :异步调用的核心 第一个参数 表示委托对应的方法实参 第二个参数 回调函数,表示异步调用结束后,自动调用的方法 第三个参数 用于向回到函数提供相关的参数信息 返回值:IAsyncResult...到最后一个参数i给回调函数的字段AsyncState赋值,如果数据很多可以定义成类或结构 } } private void MyCallBack(IAsyncResult
{ Action m = M1; m += M2; //m.Invoke(); List list=new List(); var invtl = m.GetInvocationList().OfType().ToList...第二,如果使用 BeginInvoke ,在等待时,需要拿到 IAsyncResult 才可以。...> list=new List(); var invtl = m.GetInvocationList().OfType().ToList...> list=new List(); var invtl = m.GetInvocationList().OfType().ToList
AsyncInvokeTest ====="); AddHandler handler1 = new AddHandler(Calc.Add); //IAsyncResult...: 异步操作接口(interface) //BeginInvoke: 委托(delegate)的一个异步方法的开始 IAsyncResult result1...IAsyncResult 简单的说, * 它存储异步操作的状态信息的一个接口,也可以用他来结束当前异步。...IAsyncResult result2 = handler2.BeginInvoke(1, 2, new AsyncCallback(MyCallBack), "AsycState...; Console.ReadKey(); } static void MyCallBack(IAsyncResult result)
这是一个典型的传统异步方法(相对于.net 4.5后的async/await新式异步方法来说),逻辑相比原来的同步方法ProcessRequest有点绕,首先入参除了熟悉的HttpContext外还有两个,然后还有个IAsyncResult...熟悉APM(异步编程模型)套路的朋友知道该怎么搞,不熟悉的可参看MSDN,要点就是实例化一个实现IAsyncResult的类,在其中异步或起线程执行逻辑,然后返回这个对象。...现成的实现IAsyncResult的类在.net 4.0后有Task,但如果项目不到4.0,你还找不到一个可以拿来就用的类,如果要为每个ashx实现一个IAsyncResult,想想都蛋疼,哪怕总共只需实现一个...IAsyncResult我都不情愿,好在委托这个东西编译器会为它自动生成异步模型,于是有了下面这个简单的封装: /// /// 异步请求处理基类 /// - 子类实现ProcessRequest...默认true /// public virtual bool IsReusable => true; public IAsyncResult BeginProcessRequest
BeginXXX 函数返回一个 IAsyncResult 接口,并分别接受 AsyncCallback 和一个对象,作为其最后两个输入参数。...请记住,我们的 BeginLengthyProcedure 调用需要返回一个 IAsyncResult 接口。...首先,调用的 BeginXXX 函数必须返回一个 IAsyncResult 接口。IAsyncResult 是从多个异步 I/O 操作返回的,这些操作包括访问数据流、进行 Microsoft?...您可以从这些异步操作中得到 IAsyncResult,以便从 BeginXXX 函数返回它。...您也可以创建自己的类以实现 IAsyncResult 接口,但随后可能需要以某种方式包装前面提到的某个 I/O 操作。
1: [OperationContract(AsyncPattern = true)] 2: IAsyncResult BeginDoWork(parameters, AsyncCallback...userCallback, object stateObject); 3: ReturnType EndDoWork(IAsyncResult asynResult); 比如下面两段代码可以看作相同的操作在同步和异步下的不同表现...BeginAdd(double x, double y, AsyncCallback userCallback, object stateObject); 3: double EndAdd(IAsyncResult...interface IFileReader 7: { 8: [OperationContract(AsyncPattern = true)] 9: IAsyncResult...string fileName, AsyncCallback userCallback, object stateObject); 10: 11: string EndRead(IAsyncResult
/// /// private void acceptTcpClientCallBack(IAsyncResult...发送字符串完毕 /// /// private void SendCallBack(IAsyncResult...接收字符串 /// /// private void readCallBack(IAsyncResult.../// /// 表示异步操作的状态 private void requestCallBack(IAsyncResult...接收数据完成 /// /// private void readCallBack(IAsyncResult
webservice的同步调用方法,我就不做说明了 异步调用: Private a As vbwebservice.DataManage'定义一个webservice变量 Dim ar As IAsyncResult...public sub Callback1(byval ar as IAsyncResult) ''这里可以不写任何代码 '这里的代码在调用方运行结束后,开始运行 end sub #region...返回异步调用的结果一次只能调用一次,如果想再执行一遍,就必须重新执行一遍begin的方法” 以上是vb.net的用法,下面是c#的用法 CWebService.DataManage a; System.IAsyncResult...System.EventArgs e) { a=new CWebService.DataManage(); } public void CallBack1(System.IAsyncResult
在 System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 在 System.Net.WebClient.GetWebResponse...(WebRequest request, IAsyncResult result) 在 System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult...在 System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 在 System.Net.WebClient.GetWebResponse...(WebRequest request, IAsyncResult result) 在 System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult...(WebRequest request, IAsyncResult result) 在 System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult
在 Task 的 Factory 提供了 FromAsync 方法让大家可以将 Begin 和 End 异步方法转 task 异步,但是这个方法参数很多 在 Begin 的方法里面一般都是这样写的 IAsyncResult...BeginFoo(参数 参数1, 参数 参数2..., AsyncCallback asyncCallback, object state) 在 End 的方法一般都是这样写的 返回值 EndFoo (IAsyncResult...asyncResult); 先调用 Begin 方法传入参数,拿到了 IAsyncResult 用于传入 EndFoo 作为参数,同时在 AsyncCallback 可以传入方法完成的方法 在 FromAsync...Task.Factory.FromAsync(fileStream.BeginRead, fileStream.EndRead, buffer, 0, 1024, null); 也就是有 IAsyncResult
领取专属 10元无门槛券
手把手带您无忧上云