软件编程
位置:首页>> 软件编程>> C#编程>> C#异步调用实例小结

C#异步调用实例小结

作者:软件工程师  发布时间:2023-07-16 10:31:03 

标签:C#,异步,调用

本文实例讲述了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#程序设计有所帮助。

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com