C#异步调用的应用实践,工作需要调用一个外部的webservice.为什么要进行C#异步调用回调?众所周知,普通方法运行,是单线程的,如果中途有大型操作(如:读取大文件,大批量操作数据库,网络传输等),都会导致方法阻塞,表现在界面上就是,程序卡或者死掉,界面元素不动了,不响应了。C#异步调用方法很好的解决了这些问题,C#异步调用执行某个方法,程序立即开辟一个新线程去运行你的方法,主线程包括界面就不会死掉了。C#异步调用如何开始,好理解,现在我们讨论的是如何结束这个C#异步调用出来的新线程。 首先,C#异步调用出来的新线程,必须回收,不回收是浪费资源的可耻行为,.NET也是不允许的,所以你别想钻空子,俗话说,请神容易送神难,就是这个道理。下面你可以很容易想到,回收分为2种情况:主动回收和被动回收(当然,这是我自己的理解,微软可不是这么说的),主动回收就是,你去监视那个线程,并且等待,当C#异步调用方法完成了,就把C#异步调用线程回收,焦点回归主线程,实际上就是上篇文章《C#异步调用初步》的那种情况,BeginInvoke之后又EndInvoke,如果在EndInvoke的时候,该C#异步调用线程没有完成操作,那么整个程序,包括主线程,又在阻塞了,又会出现界面“死”的情况。要想解决这个问题,就使用“被动回收”方式,其中一个重要的办法就是“C#异步调用回调”。 C#异步调用核心有二: A、 用回调函数(本例中为CallBackMethod),C#异步调用结束后,自动调用此回调函数。 B、 而不在主线程中手工等待C#异步调用结束,如上两例中在主线程中调用EndInvoke。此种方法,是在回调函数中调用EndInvoke的。 C#异步调用回调的大概流程是这样的:首先启动C#异步调用,启动参数加上C#异步调用结束时执行的方法,然后这个C#异步调用线程就不用管了,最后当这个C#异步调用线程自己完成工作了,就自动执行启动参数里的那个方法,这样确实很省心,可是代码写起来,就很复杂了。 C#异步调用四大方法是什么呢?C#异步调用四大方法的使用是如何进行的呢?让我们首先了解下什么时候用到C#异步调用: .NET Framework 允许您C#异步调用任何方法。定义与您需要调用的方法具有相同签名的委托;公共语言运行库将自动为该委托定义具有适当签名的 BeginInvoke 和 EndInvoke 方法。 BeginInvoke 方法用于启动C#异步调用。它与您需要异步执行的方法具有相同的参数,只不过还有两个额外的参数(将在稍后描述)。BeginInvoke 立即返回,不等待C#异步调用完成。BeginInvoke 返回 IasyncResult,可用于监视调用进度。 EndInvoke 方法用于检索C#异步调用结果。调用 BeginInvoke 后可随时调用 EndInvoke
方法;如果C#异步调用未完成,EndInvoke 将一直阻塞到C#异步调用完成。EndInvoke 的参数包括您需要异步执行的方法的 out 和 ref
参数(在 Visual Basic 中为 注意 Visual Studio .NET 中的智能感知功能会显示 BeginInvoke 和 EndInvoke 的参数。如果您没有使用 Visual Studio 或类似的工具,或者您使用的是 C# 和 Visual Studio .NET,请参见异步方法签名获取有关运行库为这些方法定义的参数的描述。 本主题中的代码演示了四种使用 BeginInvoke 和 EndInvoke 进行C#异步调用的常用方法。调用了 BeginInvoke 后,可以: · 进行某些操作,然后调用 EndInvoke 一直阻塞到调用完成。 · 使用 IAsyncResult.AsyncWaitHandle 获取 WaitHandle,使用它的 WaitOne 方法将执行一直阻塞到发出 WaitHandle 信号,然后调用 EndInvoke。 · 轮询由 BeginInvoke 返回的 IAsyncResult,确定C#异步调用何时完成,然后调用 EndInvoke。 · 将用于回调方法的委托传递给 BeginInvoke。该方法在C#异步调用完成后在 ThreadPool 线程上执行,它可以调用 EndInvoke。 警告:始终在C#异步调用完成后调用 EndInvoke。 下面是搜藏的代码:
另外,如果可以,定义委托的时候可以选择不用过多的修饰:
其他方法中调用:
C#异步调用的基本内容就向你介绍到这里,希望对你了解和学习C#异步调用有所帮助。 |
|