,如果在EndInvoke的时候,该异步线程没有完成操作,那么整个程序,包括主线程,又在阻塞了,又会出现界面“死”的情况。...B、 而不在主线程中手工等待异步结束,如上两例中在主线程中调用EndInvoke。此种方法,是在回调函数中调用EndInvoke的。...,否则你的下场很惨 string r = dn.EndInvoke(out i, ar); MessageBox.Show("异步完成喽!...Asyncdelegate dlgt = (Asyncdelegate)ar.AsyncState; // Call EndInvoke to retrieve the results...dlgt.EndInvoke(ar); }/* 何问起 hovertree.com */ 其他方法中调用: //异步执行 //指定委托方法 /*
APM初探 v博客前言 先交代下背景,前面几张内容主要是介绍多线程的基本知识,这一章是因为正好接触到了APM(异步编程模型),发现APM真的很强大,其中有部分知识点涉及到了委托的BeginInvoke/EndInvoke...不惧面试:委托 对于第三个知识点,是因为委托定义了两个异步方法BeginInvoke和EndInvoke。...(IAsyncResult result); } 定义一个委托时,会生成一个BeginInvoke和EndInvoke方法的类。...EndInvoke: 1.第一个参数接收BeginInvoke返回的IAnsyResult; 2.返回的TResult为委托引用的方法的返回值,这里是Add方法的int类型返回值 2.2 用委托来实现...; 6.Add方法执行完后,会自动调用回调方法AddCallback; 7.在调用EndInvoke可能抛出异常,所以需要加try/catch/finally,捕获EndInvoke的可能抛出的异常
EndInvoke监视BeginInvoke。委托类型的EndInvoke()方法:借助IasyncResult接口对象,不断查询异步调用是否结束。...BeginInvoke(方法的参数,null,null) (3)同时执行其他任务(同步) (4)获取异步执行的结果 任务的类型 res=委托变量.EndInvoke...(result); EndInvoke()方法不断循环检测运算是否结束。...总的思想:方法是通过委托变量的委托BeginInvoke()对象异步执行,EndInvoke()观察异步执行是否完 小知识:在异步中当子线程没有完成让主线程等待的做法 主线程等待异步执行完成的三种方法...result.IsCompleted) { Thread.Sleep(100); } (3)委托变量.EndInvoke(result);//主线程等待异步执行完成
3、委托的异步调用通过BeginInvoke和EndInvoke来实现。...; //异步操作返回 Console.WriteLine(handler1.EndInvoke(result1));//会等待加法类计算,如果没计算好就堵塞线程...* 注意: BeginInvoke和EndInvoke必须成对调用.即使不需要返回值, * 但EndInvoke还是必须调用,否则可能会造成内存泄漏。 ?...但是问题依然存在,当主线程运行到EndInvoke时,如果这时调用没有结束(这种情况很可能出现),这时为了等待调用结果,线程依旧会被阻塞。...可以在异步回调函数(类型为 AsyncCallback)中调用 AddHandler.EndInvoke,以获取最初提交的 AddHandler.BeginInvoke 的结果。 ?
IAsyncResult ar = consoleDelegate.BeginInvoke(null, null); consoleDelegate.EndInvoke...如代码中所示,在调用BeginInvoke之后,立即调用了EndInvoke获取结果,那么会发生什么呢? 如下图所示: 看到这里大家也许会比较诧异:为什么同步操作会在异步操作之后输出呢?...原因是这样的:EndInvoke方法会阻塞调用线程,直到异步调用结束,由于我们在异步操作中模拟了3s耗时操作,所以它会一直等待到3s结束后输出异步信息,此时才完成了异步操作,进而进行下一步的同步操作。...{ Console.WriteLine("等待执行..."); } consoleDelegate.EndInvoke...void CallBack(IAsyncResult ar) { //使用IAsyncResult的AsyncState获取BeginInvoke中的参数,并用于执行EndInvoke
var temp = m.BeginInvoke((e) => { }, null); m.EndInvoke(temp); 上面代码:如果要使用 BeginInvoke ,小心 Delegate...如果使用 BeginInvoke ,那么会在 EndInvoke 退出。...} //for (int i = 0; i < invtl.Count(); i++) //{ // invtl[i].EndInvoke...Console.WriteLine("线程ID为:{0}", Thread.CurrentThread.ManagedThreadId); } 上面代码没有 EndInvoke...如果使用 EndInvoke 会在 Main 异常 static void Main(string[] args) { Action m =
textBox_Result2.Text = Cal_Task2(5,6).ToString(); //同时可以并行其他任务 int result = objTest.EndInvoke...(iar); //获取异步执行结果 //委托类型的EndInvoke()方法:借助IAsyncResult接口对象,不断查询异步调用是否结束。...//空语句 } Console.WriteLine("Done"); int result = del.EndInvoke...在发起的线程中引用方法完成之后,发起的线程就会调用回调方法,由回调方法再调用EndInvoke之前处理异步方法的结果。...//【5】回调函数 private void MyCallBack(IAsyncResult result) { int res = objMyCal.EndInvoke
此外,在asynchronous delegates上未处理的异常很方便地在原始线程上重新抛出(更准确地说,这个线程叫做EndInvoke),因此不需要显示处理。...当你需要这个结果,在delegate上调用EndInvoke,传递已保存的IAsyncResult对象。...这里可以执行其他并行的任务 // int length = t.EndInvoke(result); Console.WriteLine("String lenth is: " + length...注意:如果你用asynchronous delegate调用的方法没有返回值,你在技术上需要调用EndInvoke。在实践中,这是开放的辩论;没有Endinvoke报警去管理处罚未编译者!...如果你选择不去调用EndInvoke,然而,你需要考虑在线程的异常去避免静默失败。
委托类型也定义了 BeginInvoke 和 EndInvoke 方法。下面我们即通过一个例子来看一下在线程池中怎么使用 APM 和委托。...; string result = threadHotel.EndInvoke(out threadId, asyncResult); WriteLine...; result = threadHotel.EndInvoke(out threadId, asyncResult); WriteLine(result...之后我们通过 EndInvoke 方法获取异步调用的结果。如果异步调用尚未完成,EndInvoke 将阻塞调用线程直到它完成。...EndInvoke 方法可以将异步操作中未处理的异常抛出到调用线程中,因此我们在使用异步时必须要调用 Begin 和 End 方法。 ?
this.label2.Text = ExecuteTask2(200).ToString(); //3.获取异步执行结果 int r = objMycal.EndInvoke...this.label2.Text = ExecuteTask2(200).ToString(); //3.获取异步执行结果 int r = objMycal.EndInvoke...} private void MyCallBack(IAsyncResult result) { int res = objMyCal.EndInvoke...这里的第三个参数位置我们添加了回调方法MyCallBack private void MyCallBack(IAsyncResult result) { int res = objMyCal.EndInvoke
Func a = iar.AsyncState as Func; int result=a.EndInvoke...fu = MyThread; fu.BeginInvoke(3, "str参数", free=> { int result= fu.EndInvoke
EndInvoke监视BeginInvoke。委托类型的EndInvoke()方法:借助IasyncResult接口对象,不断查询异步调用是否结束。
[MSDN:公共语言运行库会自动使用适当的签名为该委托定义 BeginInvoke 和 EndInvoke 方法。] 在代码3中出现了IAsyncResult接口,这是异步状态接口,什么意思呢。...AsyncResult可以获取到当初调用BeginInvoke的委托实例 int count = (result.AsyncDelegate as BinaryOperaton).EndInvoke...//通过IsCompleted进行判断异步操作是否已经结束,true已经结束,false未结束 { int count = operation.EndInvoke...while (true) { if (result.AsyncWaitHandle.WaitOne(4000)) break; } int count = operation.EndInvoke...comresult = asyresult as AsyncResult; int count = (comresult.AsyncDelegate as BinaryOperaton).EndInvoke
(asyncResult);其实IAsyncResult贯穿了异步执行的开始和结束委托通过BeginInvoke和EndInvoke来启动异步和结束异步每个委托的BeginInvoke方法都暴露或返回了实现...类型的接口对象的根本目的是可以让该异步方法体自由的代码中控制,有时候主线程需要等待异步执行后才能执行,虽然这违背的异步的初衷但是还是可以纳入可能的需求行列,所以如果我们在beginInoke后立刻使用EndInvoke...(asyncResult); 其实IAsyncResult贯穿了异步执行的开始和结束 委托通过BeginInvoke和EndInvoke来启动异步和结束异步 每个委托的BeginInvoke方法都暴露或返回了实现...执行回调函数方法体,注意使用委托的 EndInvoke方法结束异步操作,并且输出显示传入异步回调函数的参数 再次强调第五点: (1) 由于使用了回调函数,所以必然异步方法体已经执行过了...,所以在回调函数中使用EndInvoke方法是不会阻塞的, (2) 能通过EndInvoke方法获得一些返回结果,例如FileStream.EndRead()能够返回读取的字节数等等 6
如果订阅者的方法抛出异常,.NET会捕捉到它,但是只有在调用EndInvoke()的时候,才会将异常重新抛出。...本节就对BeginInvoke()方法、EndInvoke()方法和其相关的IAysncResult做一个简单的介绍。...,以便在调用EndInvoke()时进行传递。...这里最重要的就是EndInvoke()方法的返回值,它就是方法的返回值。...所以在调用完BeginInvoke()后立即执行EndInvoke()是没有任何意义的。
}; 13 func.BeginInvoke((ar) => 14 { 15 var result = func.EndInvoke...}; 38 func.BeginInvoke((ar) => 39 { 40 var result = func.EndInvoke
一、异步函数模型 c#中提供异步函数编程模式,只要是使用委托对象封装的函数都可以实现该函数的异步调用,这是因为委托类型有BeginInvoke和EndInvoke这两个方法来支持异步调用。...WorkPro); IAsyncResult r= d.BeginInvoke(1000,null,null);//no.1 int result= d.EndInvoke...callback, object @object) 在no.1处还是和第一个例子一样调用委托,不同的是用IAsyncResult接口的变量接收了异步调用(并不是异步函数)的返回状态,这是方便后面调用EndInvoke...在no.2处使用d.EndInvoke(r)来接受异步函数返回值的。...必须指出的是,主线程在调用委托的EndInvoke(r)方法时,当异步函数没有执行完毕的话,主线程会一直处于阻塞,等待异步函数执行完毕,获取返回值之后才执行no.3的for循环。
通过EndInvoke获得异步委托的执行结果 我们可以通过EndInvoke获得委托标的函数的返回值: IAsyncResult ia = d.BeginInvoke(1073676287, null...现在你再运行程序,程序会阻塞在EndInvoke,你手贱敲了任意一个键,程序也不会结束。另外,我们还获得了异步委托的结果,即该大数是质数。...总结 使用委托的异步编程模型(APM): 通过建立一个委托和使用BeginInvoke调用委托来实现异步,通过EndInvoke来获得结果,但要注意的是,EndInvoke会令主线程进入阻塞状态,卡死主线程...这个密封类包括三个核心函数,Invoke方法赋予其同步访问的能力,BeginInvoke,EndInvoke赋予其异步访问的能力。...EndInvoke的输入总是IAsyncResult,加上委托中的out和ref(如果有的话)类型的输入,输出类型则是委托的输出类型。
领取专属 10元无门槛券
手把手带您无忧上云