`
isiqi
  • 浏览: 16651159 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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 中为 ByRef 和 ByRef)以及由 BeginInvoke 返回的 IAsyncResult。
注意 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。

测试方法和异步委托
四个示例全部使用同一个长期运行的测试方法 TestMethod。该方法显示一个表明它已开始处理的控制台信息,休眠几秒钟,然后结束。TestMethod 有一个 out 参数(在 Visual Basic 中为 ByRef),它演示了如何将这些参数添加到 BeginInvoke 和 EndInvoke 的签名中。您可以用类似的方式处理 ref 参数(在 Visual Basic 中为 ByRef)。
下面的代码示例显示 TestMethod 以及代表 TestMethod 的委托;若要使用任一示例,请将示例代码追加到这段代码中。
注意 为了简化这些示例,TestMethod 在独立于 Main() 的类中声明。或者,TestMethod 可以是包含 Main() 的同一类中的 static 方法(在 Visual Basic 中为 Shared)。

1、C#异步调用四大方法之使用 EndInvoke 等待异步调用
异步执行方法的最简单方式是以 BeginInvoke 开始,对主线程执行一些操作,然后调用 EndInvoke。EndInvoke 直到C#异步调用完成后才返回。这种技术非常适合文件或网络操作,但是由于它阻塞 EndInvoke,所以不要从用户界面的服务线程中使用它。

运行结果:

Main thread 4332 does some work.
Test method begins.
The call executed on thread 3640,with return value "MyCallTime was 5000".
请按任意键继续. . .

2、C#异步调用四大方法之使用 WaitHandle 等待异步调用
等待 WaitHandle 是一项常用的线程同步技术。您可以使用由 BeginInvoke 返回的 IAsyncResult 的 AsyncWaitHandle 属性来获取 WaitHandle。C#异步调用完成时会发出 WaitHandle 信号,而您可以通过调用它的 WaitOne 等待它。
如果您使用 WaitHandle,则在C#异步调用完成之后,但在通过调用 EndInvoke 检索结果之前,可以执行其他处理。

运行结果:

Main thread 6864 does some work.
Test method begins.
The call executed on thread 7044, with return value "MyCallTime was 3000".
请按任意键继续. . .

3、C#异步调用四大方法之轮询异步调用完成
您可以使用由 BeginInvoke 返回的 IAsyncResult 的 IsCompleted 属性来发现C#异步调用何时完成。从用户界面的服务线程中进行C#异步调用时可以执行此操作。轮询完成允许用户界面线程继续处理用户输入。

运行结果:

Test method begins.
The call executed on thread 5300, with return value "MyCallTime was 3000".
请按任意键继续. . .

4、C#异步调用四大方法之异步调用完成时执行回调方法
如果启动异步调用的线程不需要处理调用结果,则可以在调用完成时执行回调方法。回调方法在 ThreadPool 线程上执行。
要使用回调方法,必须将代表该方法的 AsyncCallback 委托传递给 BeginInvoke。也可以传递包含回调方法将要使用的信息的对象。例如,可以传递启动调用时曾使用的委托,以便回调方法能够调用 EndInvoke。

运行结果:

Press Enter to close application.
Test method begins.
The call executed on thread 7632, with return value "MyCallTime was 3000".

C#异步调用四大方法的基本内容就向你介绍到这里,希望对你了解和学习C#异步调用有所帮助。

改自:

http://www.blogjava.net/china-qd/archive/2010/08/23/329675.html

分享到:
评论

相关推荐

    C#异步调用四大方法详解借鉴.pdf

    以下是对C#异步调用四大方法的详细解释: 1. **使用EndInvoke等待异步调用** 当调用BeginInvoke启动异步方法时,它会立即返回一个IAsyncResult对象。你可以直接调用EndInvoke,这将阻塞直到异步调用完成。例如: ...

    C#异步调用的好处和方法.pdf

    本文将深入探讨C#异步调用的好处及其实现方法。 #### 为什么需要异步调用? 在传统的同步编程模型中,程序执行是按顺序进行的,即每条指令或方法调用都需要等待前一条指令或方法完全执行完毕后才能继续。这种方式...

    C#异步调用示例详解

    本文实例为大家分享了C#异步调用的具体代码,供大家参考,具体内容如下 using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.Threading....

    C#同步调用,异步调用,异步回调.docx

    C# 同步调用、异步调用和异步回调详解 在 C# 编程中,调用方法可以分为同步调用和异步调用两种。同步调用是指当前线程阻塞,等待方法执行完毕后继续执行,而异步调用则是将方法调用交给线程池,当前线程继续执行不...

    解析C#中委托的同步调用与异步调用(实例详解)

    为了解决这个问题,C#提供了异步调用,通过`BeginInvoke`和`EndInvoke`方法实现。`BeginInvoke`启动一个异步调用,在后台线程执行任务,不会阻塞主线程。例如,`handler.BeginInvoke(1, 2, null, null)`会立即返回,...

    js调用C#方法

    ### JS调用C#方法及C#调用JS方法详解 在Web开发中,前后端交互是必不可少的一个环节。本文将详细介绍如何实现前端JavaScript(JS)与后端C#之间的相互调用,这对于构建功能丰富的Web应用至关重要。下面将按照问题的...

    异步调用的参数及返回值

    ### 异步调用的参数及返回值处理详解 #### 一、引言 在现代软件开发中,异步编程模式越来越受到重视。它能够有效提高应用程序的响应速度和资源利用率,尤其在网络请求、文件读写等耗时操作中表现突出。在C#语言中,...

    C#异步回调算法

    ### C# 异步回调算法详解 #### 一、回调方法的签名与工作机制 在C#中,异步编程是一种非常重要的技术,特别是在处理长时间运行的任务或者需要等待外部操作完成的场景下。其中,`BeginInvoke` 和 `EndInvoke` 方法...

    C#高效反射调用方法类实例详解

    C#高效反射调用方法类实例详解 本篇文章主要介绍了C#中高效反射调用方法类的实例内容,涉及到反射机制、方法调用、类实例化等知识点。下面将详细解释相关知识点: 1. 反射机制:在C#中,反射机制是指通过反射类型...

    C#窗体中Invoke和BeginInvoke方法详解

    ### C#窗体中Invoke和BeginInvoke方法详解 在探讨C#窗体中`Invoke`和`BeginInvoke`方法的使用及其重要性之前,我们首先需要理解.NET框架下的多线程与GUI操作的基本原则,以及为何这两者在跨线程更新GUI时不可或缺。...

    C#委托及匿名方法详解

    在C#编程语言中,委托(Delegate)与匿名方法是两个重要的概念,它们在实现事件、回调函数等场景中发挥着关键作用。本文将详细解析C#中的委托以及匿名方法,通过实例帮助读者深入理解其原理与应用。 ### 一、委托...

    c# FTP操作类上传、异步上传文件、下载

    ### C#中的FTP操作类详解 #### 概述 在C#编程语言中,通过创建一个专门用于FTP操作的类可以极大地简化与FTP服务器交互的过程。这类操作包括但不限于上传文件、下载文件、创建目录等。本文将详细介绍如何利用C#实现...

    asp.net前台调用后台方法传参数

    ### ASP.NET 前台调用后台方法传参数详解 #### 一、ASP.NET简介 ASP.NET 是一种用于构建动态Web应用程序的服务器端技术。它由Microsoft开发,并且是.NET框架的一部分。通过ASP.NET,开发者可以创建功能强大、交互...

    深入分析C#异步编程详解

    同步方法和异步方法的区别同步方法调用在程序继续执行之前需要等待同步方法执行完毕返回结果异步方法则在被调用之后立即返回以便程序在被调用...同时执行其它操作异步编程概览.NET Framework 允许您异步调用任何方法...

    C#异步编程详解

    前言 本节主要介绍异步编程中Task、Async和Await的基础知识。...C#5.0 .NET4.5 以后关键字Async和Await的使用,使得异步编程变得异常简单。 多线程中的处理程序依然是顺序执行,但是多线程的缺点也同样明显,

Global site tag (gtag.js) - Google Analytics