首页 > 编程 > C# > 正文

C#异步调用实例小结

2020-01-24 01:33:25
字体:
来源:转载
供稿:网友

本文实例讲述了C#异步调用的方法。分享给大家供大家参考。具体如下:

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)  {  }  /// <summary>  /// 实现委托的方法  /// </summary>  /// <param name="iCallTime"></param>  /// <param name="iExecThread"></param>  /// <returns></returns>  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: 同步调用方法  /// <summary>  /// 示例 1: 同步调用方法  /// </summary>  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() 调用模式异步调用方法  /// <summary>  /// 示例 2: 通过 EndInvoke() 调用模式异步调用方法    /// </summary>  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 来等待调用完成  /// <summary>  /// 示例 3: 异步调用方法并使用 A WaitHandle 来等待调用完成  /// </summary>  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: 异步调用方法通过轮询调用模式  /// <summary>  /// 示例 4: 异步调用方法通过轮询调用模式  /// </summary>  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: 异步方法完成后执行回调  /// <summary>  /// 示例 5: 异步方法完成后执行回调  /// </summary>  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#程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表