標籤:
class Program { /* *這是需要非同步執行的方法,COPY一個檔案 */ public void CopyFile(String fileName, out bool result) { Console.WriteLine("Move file " + fileName + "..."); for (int i = 0; i < 10; i++) { Thread.Sleep(200); Console.WriteLine("Move file is running..." + i); } Console.WriteLine("Move file finished"); result = true; } /* *定義COPY檔案的委託,將來CopyFile方法就委託給它去非同步執行 */ public delegate void CopyFileDelegate(String fileName, out bool result); static void Main(string[] args) { bool result; Program aa = new Program(); // 開始委託方法,以後都由copyFile這個變數來做事 CopyFileDelegate copyFile = new CopyFileDelegate(aa.CopyFile); Console.WriteLine("[Main] Invoking the asynchronous " + " Copy file method"); //委託調用非同步方法呼叫去執行 IAsyncResult iAR = copyFile.BeginInvoke("songlin.txt", out result, null, null); // 主方法不用等待COPY FILE方法,繼續自己的事情 Console.WriteLine("[Main] Doing other work"); for (int i = 0; i < 10; i++) { Thread.Sleep(200); Console.WriteLine("[Main]MainMethod is running..." + i); } Console.WriteLine(" [Main] Waiting for file transformation to finish"); /* 主方法自己的事情做完,開始檢查COPYFILE有沒有完成。 * 使用它的 WaitOne 方法將執行一直等到發出 WaitHandle 訊號,然後調用 EndInvoke。 * 注意:非同步呼叫完成時會發出 WaitHandle 訊號,可以通過WaitOne 來等待它*/ iAR.AsyncWaitHandle.WaitOne(); Console.WriteLine("[Main] Copy file finished, cleaning up"); /* EndInvoke 方法用於檢索非同步呼叫結果。調用 BeginInvoke 後可隨時調用 EndInvoke 方法; * 如果非同步呼叫未完成,EndInvoke 將一直阻塞到非同步呼叫完成。 */ copyFile.EndInvoke(out result, iAR); Console.WriteLine("[Main] The result is {0}", result); Console.ReadLine(); } }
C#中委託