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) { } /// <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#程序设计有所帮助。