資源簡介
c# 實現多線程的操作,輪詢等待回調等異步操作,適合初學者的源碼
代碼片段和文件信息
using?System;
using?System.Collections.Generic;
using?System.Text;
using?System.Threading;
namespace?ConsoleApplication1
{
????public?delegate?string?AsyncDelegate(int?callDuration?out?int?threadId);
????class?Program
????{
????????static?void?Main(string[]?args)
????????{
????????????Fun1();
????????????Fun2();
????????????Fun3();
????????????Fun4();
????????????Console.ReadLine();
????????}
????????private?static?int?threadId;
????????//阻塞等待???使用?EndInvoke?等待異步調用??
????????static?void?Fun1()
????????{
????????????//創建示例類的實例。
????????????AsyncDemo?ad?=?new?AsyncDemo();
????????????//?創建委托
????????????AsyncDelegate?dlgt?=?new?AsyncDelegate(ad.TestMethod);
????????????//?委托在這里開始異步調用。
????????????IAsyncResult?ar?=?dlgt.BeginInvoke(5000out?threadId?null?null);
????????????//人為的線程阻塞。
????????????Thread.Sleep(0);
????????????Console.WriteLine(“主線程?{0}開始工作“Thread.CurrentThread.ManagedThreadId);
????????????//?委托開始EndInvoke調用,這個過程會使主線程等待異步調用完成并返回結果。
????????????string?ret?=?dlgt.EndInvoke(out?threadId?ar);
????????????Console.WriteLine(“使用?EndInvoke?等待異步調用!!!“);
????????????Console.WriteLine(“異步線程?{0}返回值?\“{1}\“.“?threadId?ret);
????????????Console.WriteLine(“主線程{0}結束工作“?Thread.CurrentThread.ManagedThreadId);
????????}
????????
????????//阻塞等待??使用?WaitHandle?等待異步調用
????????static?void?Fun2()
????????{
????????????AsyncDemo?ad?=?new?AsyncDemo();
????????????AsyncDelegate?dlgt?=?new?AsyncDelegate(ad.TestMethod);
????????????IAsyncResult?ar?=?dlgt.BeginInvoke(5000out?threadId?null?null);
????????????Thread.Sleep(0);
????????????Console.WriteLine(“主線程?{0}開始工作“?Thread.CurrentThread.ManagedThreadId);
????????????//主線程在這里等待,直到異步線程執行完。
????????????ar.AsyncWaitHandle.WaitOne();
????????????//?和前一方案的區別在于,你可以在異步調用完成后,獲取異步調用返回值之前
????????????//在這里做點任何你想作的事。
????????????//調用EndInvoke獲取異步調用的返回結果.
????????????string?ret?=?dlgt.EndInvoke(out?threadId?ar);
????????????Console.WriteLine(“使用?WaitHandle?等待異步調用!!!“);
????????????Console.WriteLine(“異步線程?{0}返回值?\“{1}\“.“?threadId?ret);
????????????Console.WriteLine(“主線程{0}結束工作“?Thread.CurrentThread.ManagedThreadId);
????????}
????????//輪詢狀態????輪詢異步調用完成
????????static?void?Fun3()
????????{
????????????AsyncDemo?ad?=?new?AsyncDemo();
????????????AsyncDelegate?dlgt?=?new?AsyncDelegate(ad.TestMethod);
????????????IAsyncResult?ar?=?dlgt.BeginInvoke(5000out?threadId?null?null);
????????????Console.WriteLine(“使用輪詢異步調用!!!“);
????????????Console.WriteLine(“主線程?{0}開始工作“?Thread.CurrentThread.ManagedThreadId);
????????????//這里每隔10毫秒就檢測(輪詢)一下異步執行的狀態,
????????????//直到異步調用完成,IsCompleted的值變為ture為止。
????????????while?(ar.IsCompleted?==?false)
????????????{
????????????????Thread.Sleep(10);
????????????}
????????????//還記得微軟的那個善意的提醒嗎?雖然IsCompleted為true了,
????????????//我們還是調用一下EndInvoke,來獲取返回值。
????????????string?ret?=?dlgt.EndInvoke(out?threadId?ar);
????????????Console.WriteLine(“異步線程?{0}返回值?\“{1}\“.“?threadId?ret);
????????????Console.
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????16384??2010-06-07?16:59??ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe
?????文件??????15872??2010-06-07?16:59??ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.pdb
?????文件???????5632??2005-11-11?22:25??ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.vshost.exe
?????文件???????1972??2010-06-06?16:39??ConsoleApplication1\ConsoleApplication1\ConsoleApplication1.csproj
?????文件????????617??2010-06-07?17:01??ConsoleApplication1\ConsoleApplication1\obj\ConsoleApplication1.csproj.FileListAbsolute.txt
?????文件??????16384??2010-06-07?16:59??ConsoleApplication1\ConsoleApplication1\obj\Debug\ConsoleApplication1.exe
?????文件??????15872??2010-06-07?16:59??ConsoleApplication1\ConsoleApplication1\obj\Debug\ConsoleApplication1.pdb
?????文件???????5691??2010-06-07?17:05??ConsoleApplication1\ConsoleApplication1\Program.cs
?????文件???????1221??2010-06-06?16:39??ConsoleApplication1\ConsoleApplication1\Properties\AssemblyInfo.cs
?????文件????????946??2010-06-06?16:39??ConsoleApplication1\ConsoleApplication1.sln
????..A..H.?????10752??2010-06-07?17:05??ConsoleApplication1\ConsoleApplication1.suo
?????目錄??????????0??2010-06-06?16:39??ConsoleApplication1\ConsoleApplication1\obj\Debug\TempPE
?????目錄??????????0??2010-06-06?16:43??ConsoleApplication1\ConsoleApplication1\bin\Debug
?????目錄??????????0??2010-06-07?16:59??ConsoleApplication1\ConsoleApplication1\obj\Debug
?????目錄??????????0??2010-06-06?16:38??ConsoleApplication1\ConsoleApplication1\bin
?????目錄??????????0??2010-06-06?16:41??ConsoleApplication1\ConsoleApplication1\obj
?????目錄??????????0??2010-06-06?16:39??ConsoleApplication1\ConsoleApplication1\Properties
?????目錄??????????0??2010-06-07?17:05??ConsoleApplication1\ConsoleApplication1
?????目錄??????????0??2010-06-06?16:39??ConsoleApplication1
-----------?---------??----------?-----??----
????????????????91343????????????????????19
- 上一篇:GridView的增刪改查功能
- 下一篇:blowfish算法的C#實現
評論
共有 條評論