当前位置:  编程技术>.net/c#/asp.net

c# 异步调用的代码(简单示例)

    来源: 互联网  发布时间:2014-08-30

    本文导语:  c#实现异步调用的例子。 代码示例: ///c3 异步调用 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Threading; using System.Windows.Forms; namespace CW {   public partial...

c#实现异步调用的例子。

代码示例:

///c3 异步调用
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace CW
{
  public partial class AsyncDemo : Form
  {
 public AsyncDemo()
 {
   InitializeComponent();
 }

 private void Delgate_Load(object sender, EventArgs e)
 {
 }

 ///
 /// 实现委托的方法
 ///
 ///
 ///
 ///
 string LongRunningMethod(int iCallTime, out int iExecThread)
 {
   Thread.Sleep(iCallTime);
   iExecThread = AppDomain.GetCurrentThreadId();
   return "MyCallTime was " + iCallTime.ToString();
 }

 delegate string MethodDelegate(int iCallTime, out int iExecThread);

 #region 示例 1: 同步调用方法#region 示例 1: 同步调用方法
 /**/
 /*
  *  同步调用方法
  * */
 /**/
 ///
 /// 示例 1: 同步调用方法
 ///
 public void DemoSyncCall()
 {
   string s;
   int iExecThread;

   // Create an instance of a delegate that wraps LongRunningMethod.
   MethodDelegate dlgt = new MethodDelegate(this.LongRunningMethod);

   // Call LongRunningMethod using the delegate.
   s = dlgt(3000, out iExecThread);

   MessageBox.Show(string.Format ("The delegate call returned the string: {0}, and the thread ID {1}", s, iExecThread.ToString() ) );

 }
 #endregion

 #region 示例 2: 通过 EndInvoke() 调用模式异步调用方法
 /**/
 /*
  * 使用调用模式是要调用 BeginInvoke , 做某些处理主线程, 并调用 EndInvoke() 。
  * 注意不 EndInvoke() 不返回直到异步调用已完成。
  * 此调用模式是有用当要有调用线程正在执行异步调用, 同时工作。
  * 有同时发生工作可改善许多应用程序的性能。
  * 常见任务以异步运行以此方式是文件或网络操作。
  * */
 /**/
 ///
 /// 示例 2: 通过 EndInvoke() 调用模式异步调用方法      
 ///
 public void DemoEndInvoke()
 {
   MethodDelegate dlgt = new MethodDelegate(this.LongRunningMethod);
   string s;
   int iExecThread;

   // Initiate the asynchronous call.
   IAsyncResult ar = dlgt.BeginInvoke(5000, out iExecThread, null, null);

   // Do some useful work here. This would be work you want to have
   // run at the same time as the asynchronous call.

   // Retrieve the results of the asynchronous call.
   s = dlgt.EndInvoke(out iExecThread, ar);

   MessageBox.Show(string.Format ("The delegate call returned the string: {0}, and the number {1}", s, iExecThread.ToString() ) );
 }
 #endregion

 #region 示例 3: 异步调用方法并使用 A WaitHandle 来等待调用完成
 /**/
 /*
  * 由 BeginInvoke() 返回 IAsyncResult 具有一个 AsyncWaitHandle 属性。
  * 该属性返回 WaitHandle 异步调用完成后, 通知是。 等待 WaitHandle 是常见线程同步技术。
  * 通过是 WaitHandle WaitOne() 方法调用线程等待 WaitHandle 上。
  * 直到是通知 WaitHandle WaitOne() 块。 当 WaitOne() 返回, 您在调用 EndInvoke() 之前进行一些额外工作。
  * 对于执行文件或网络操作, 否则会阻塞调用主线程存为, 以前示例中此技术很有用。
  * */
 /**/
 ///
 /// 示例 3: 异步调用方法并使用 A WaitHandle 来等待调用完成
 ///
 public void DemoWaitHandle()
 {
   string s;
   int iExecThread;

   MethodDelegate dlgt = new MethodDelegate(this.LongRunningMethod);

   // Initiate the asynchronous call.
   IAsyncResult ar = dlgt.BeginInvoke(3000, out iExecThread, null, null);

   // Do some useful work here. This would be work you want to have
   // run at the same time as the asynchronous call.

   // Wait for the WaitHandle to become signaled.
   ar.AsyncWaitHandle.WaitOne();

   // Get the results of the asynchronous call.
   s = dlgt.EndInvoke(out iExecThread, ar);

   MessageBox.Show(string.Format ("The delegate call returned the string: {0}, and the number {1}", s, iExecThread.ToString() ) );
 }
 #endregion

 #region 示例 4: 异步调用方法通过轮询调用模式
 /**/
 /*
  * 由 BeginInvoke() 返回 IAsyncResult 对象有个 IsCompleted 属性异步调用完成后返回 True 。
  * 然后可调用 EndInvoke() 。 如果您应用程序不断工作对不做要长期函数调用已被此调用模式很有用。
  * MicrosoftWindows 应用程序是这样的示例。
  * 主线程的 Windows 应用程序可以继续以执行异步调用时处理用户输入。
  * 它可定期检查 IsCompleted 到调用是否完成。 它调用 EndInvoke 当 IsCompleted 返回 True 。
  * 直到它知道操作已完成因为 EndInvoke() 阻止直到异步操作为完整, 应用程序不调用它。
  * */
 /**/
 ///
 /// 示例 4: 异步调用方法通过轮询调用模式
 ///
 public void DemoPolling()
 {
   MethodDelegate dlgt = new MethodDelegate(this.LongRunningMethod);
   string s;
   int iExecThread;

   // Initiate the asynchronous call.
   IAsyncResult ar = dlgt.BeginInvoke(3000, out iExecThread, null, null);

   // Poll IAsyncResult.IsCompleted
   while (ar.IsCompleted == false)
   {
       Thread.Sleep(10);  // pretend to so some useful work
   }
   s = dlgt.EndInvoke(out iExecThread, ar);

   MessageBox.Show(string.Format ("The delegate call returned the string: {0}, and the number {1}", s, iExecThread.ToString() ) );
 }
 #endregion

 #region 示例 5: 异步方法完成后执行回调
 /**/
 /*
  * 本节, 中示例提供对 BeginInvoke() 函数, 异步调用完成后系统执行回调委托。
  * 回调调用 EndInvoke() 并处理异步调用的结果。
  * 如果启动异步调用线程不需要处理结果是调用此调用模式很有用。
  * 异步调用完成后系统调用线程以外启动线程上调。
  * 若使用此调用模式, 作为第二到最后 - BeginInvoke() 函数的参数必须传递 AsyncCallback 类型的委托。
  * BeginInvoke() 还有最后参数键入 对象 到您可以将任何对象。 当它调用该对象可用于您回调函数。
  * 为此参数一个重要用途是以传递用于初始化调用该委托。
  * 回调函数然后使用与该委托 EndInvoke() 函数来完成调用。 此调用模式是所示。
  * by http://www.
  * */
 /**/
 ///
 /// 示例 5: 异步方法完成后执行回调
 ///
 public void DemoCallback()
 {
   MethodDelegate dlgt = new MethodDelegate(this.LongRunningMethod);
   int iExecThread;

   // Create the callback delegate.
   AsyncCallback cb = new AsyncCallback(MyAsyncCallback);

   // Initiate the Asynchronous call passing in the callback delegate
   // and the delegate object used to initiate the call.
   IAsyncResult ar = dlgt.BeginInvoke(5000, out iExecThread, cb, dlgt);
 }

 public void MyAsyncCallback(IAsyncResult ar)
 {
   string s;
   int iExecThread;

   // Because you passed your original delegate in the asyncState parameter
   // of the Begin call, you can get it back here to complete the call.
   MethodDelegate dlgt = (MethodDelegate)ar.AsyncState;

   // Complete the call.
   s = dlgt.EndInvoke(out iExecThread, ar);
   MessageBox.Show(String.Format("The delegate call returned the string: {0}, and the number {1}", s, iExecThread.ToString()));

   //Console.WriteLine(string.Format ("The delegate call returned the string:   "{0}", and the number {1}", s, iExecThread.ToString() ) );
 }
 #endregion

 private void button1_Click(object sender, EventArgs e)
 {
   //DemoSyncCall() ;
   //DemoEndInvoke();
   //DemoWaitHandle();
   //DemoPolling();
   DemoCallback();
 }
}
}


    
 
 

您可能感兴趣的文章:

  • c#异步task示例分享(异步操作)
  • 推荐代码:c# 异步更新UI 不阻塞 流畅
  • C#同步和异步调用方法实例
  • c#异步读取数据库与异步更新ui的代码实现
  • C#异步调用的好处和方法分享
  • c#异步操作后台运行(backgroundworker类)示例
  • C#基础之异步调用实例教程
  • 解析C#中委托的同步调用与异步调用(实例详解)
  • C# 委托的三种调用示例(同步调用 异步调用 异步回调)
  • c#实现简单控制台udp异步通信程序示例
  • C#同步、异步远程下载文件实例
  • 深入分析C#异步编程详解
  • c#异步发送邮件的类实例代码
  • c#异步发送邮件的类
  • c#并行任务多种优化方案分享(异步委托)
  • c#(Socket)异步套接字代码示例
  • C# Socket 异步套接字的代码一例
  • java异步上传图片示例
  • jQuery异步加载数据并添加事件示例
  • jQuery异步验证用户名是否存在示例代码
  • python异步任务队列示例
  • 使用jquery.upload.js实现异步上传示例代码
  • php 异步调用方法实现示例
  • .net的socket异步通讯示例分享
  • android异步请求服务器数据示例
  • JQuery异步加载无限下拉框级联功能实现示例
  • php+ajax图片文件异步上传示例代码
  • jquery uploadify和apache Fileupload实现异步上传文件示例
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • struts+spring+hibernate+jquery实现分页功能的几个基本类介绍(异步加载)
  • Linux 中关于异步函数的问题
  • java异步方法调用框架 asyn4j
  • 异步消息传递框架 Errai
  • Balsa 异步电路仿真和合成系统
  • 异步I/O库 libeio
  • 异步 JS 工具 Async.js
  • 异步JS开发库 Wind.js
  • 异步JS开发库 Jscex
  • JS异步编程库 WinJS
  • 异步connect的问题,27日18:00前结账。
  • ACE linux下的异步IO
  • unix下异步进程的问题
  • 请问单线程异步机制的优势在哪里?
  • Node.js 异步错误处理 LAEH2
  • 纯异步的Server简单实现 Server
  • 内核进程间发送信号用哪个函数,如果没有这东西,那内核里异步通知用哪个东西
  • PHP异步执行技巧分享
  • Swift 异步编程库 Wyrd
  • 异步网络编程框架 itachi
  • C++异步网络开发库 ez_poll


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3