C#異步調(diào)用實(shí)例小結(jié)
本文實(shí)例講述了C#異步調(diào)用的方法。分享給大家供大家參考。具體如下:
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>
/// 實(shí)現(xiàn)委托的方法
/// </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: 同步調(diào)用方法#region 示例 1: 同步調(diào)用方法
/// <summary>
/// 示例 1: 同步調(diào)用方法
/// </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: 通過(guò) EndInvoke() 調(diào)用模式異步調(diào)用方法
/// <summary>
/// 示例 2: 通過(guò) EndInvoke() 調(diào)用模式異步調(diào)用方法
/// </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: 異步調(diào)用方法并使用 A WaitHandle 來(lái)等待調(diào)用完成
/// <summary>
/// 示例 3: 異步調(diào)用方法并使用 A WaitHandle 來(lái)等待調(diào)用完成
/// </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: 異步調(diào)用方法通過(guò)輪詢(xún)調(diào)用模式
/// <summary>
/// 示例 4: 異步調(diào)用方法通過(guò)輪詢(xún)調(diào)用模式
/// </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: 異步方法完成后執(zhí)行回調(diào)
/// <summary>
/// 示例 5: 異步方法完成后執(zhí)行回調(diào)
/// </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();
}
}
}
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
C#中當(dāng)前時(shí)間轉(zhuǎn)為時(shí)間戳的3個(gè)方法
在計(jì)算機(jī)應(yīng)用世界里,無(wú)論是為了記錄事件的發(fā)生時(shí)間、保障數(shù)據(jù)一致性還是提升安全性,時(shí)間戳都是不可或缺的重要工具,下面我們就來(lái)看看C#中轉(zhuǎn)換當(dāng)前時(shí)間為時(shí)間戳有哪些方法吧2024-12-12
C#?as?和?is?運(yùn)算符區(qū)別和用法示例解析
在C#中,as?和?is?關(guān)鍵字都用于處理類(lèi)型轉(zhuǎn)換的運(yùn)算符,但它們有不同的用途和行為,本文我們將詳細(xì)解釋這兩個(gè)運(yùn)算符的區(qū)別和用法,需要的朋友可以參考下2025-01-01
C#實(shí)現(xiàn)Winform版計(jì)算器
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)Winform版計(jì)算器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05
c# WinForm 窗體之間傳值的幾種方式(小結(jié))
這篇文章主要介紹了WinForm 窗體之間傳值的幾種方式(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
C#實(shí)現(xiàn)改變DataGrid某一行和單元格顏色的方法
這篇文章主要介紹了C#實(shí)現(xiàn)改變DataGrid某一行和單元格顏色的方法,主要涉及DataGrid控件的添加與使用、數(shù)據(jù)源的綁定、單元格與行的獲取等操作。需要的朋友可以參考下2014-09-09
c#生成excel示例sql數(shù)據(jù)庫(kù)導(dǎo)出excel
這篇文章主要介紹了c#操作excel的示例,里面的方法可以直接導(dǎo)出數(shù)據(jù)到excel,大家參考使用吧2014-01-01
C#實(shí)現(xiàn)ArrayList動(dòng)態(tài)數(shù)組的示例
ArrayList是一個(gè)動(dòng)態(tài)數(shù)組,可以用來(lái)存儲(chǔ)任意類(lèi)型的元素,本文就來(lái)介紹一下C#實(shí)現(xiàn)ArrayList動(dòng)態(tài)數(shù)組的示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
總結(jié)C#網(wǎng)絡(luò)編程中對(duì)于Cookie的設(shè)定要點(diǎn)
這篇文章主要介紹了總結(jié)C#網(wǎng)絡(luò)編程中對(duì)于Cookie的設(shè)定要點(diǎn),文中還給出了一個(gè)cookie操作實(shí)例僅供參照,需要的朋友可以參考下2016-04-04

