C#异步调用实例小结

这篇文章主要介绍了C#异步调用的方法,实例分析了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) { } ///  /// 实现委托的方法 ///  ///  ///  ///  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() 调用模式异步调用方法 ///  /// 示例 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 来等待调用完成 ///  /// 示例 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: 异步调用方法通过轮询调用模式 ///  /// 示例 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: 异步方法完成后执行回调 ///  /// 示例 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#程序设计有所帮助。

以上就是C#异步调用实例小结的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » 其他教程