using System; using System.Collections.Generic; using System.Text; using System.Threading; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Console.WriteLine(DateTime.Now); AsyncOpTest op = new AsyncOpTest(); op.GetTimeCompleted += GetTimeCompleted; op.DelayGetTimeAsync(6); Console.WriteLine("function return"); Thread.Sleep(-1); //等待非同步作業結束 } static void GetTimeCompleted(object sender, GetTimeCompletedEventArgs e) { Console.WriteLine(e.Time); Console.WriteLine("function end"); } } class GetTimeCompletedEventArgs : EventArgs { public GetTimeCompletedEventArgs(DateTime time) { this.time = time; } private DateTime time; public DateTime Time { get { return time; } } } class AsyncOpTest { public event EventHandler<GetTimeCompletedEventArgs> GetTimeCompleted; public DateTime DelayGetTime(int seconds) //使用同步方式擷取時間 { Thread.Sleep(seconds * 1000); return DateTime.Now; } delegate DateTime GetTimeHandler(int seconds); public void DelayGetTimeAsync(int seconds) //使用非同步方式延遲擷取時間 { GetTimeHandler calu = DelayGetTime; calu.BeginInvoke(seconds, CaluCallBack, calu); } void CaluCallBack(IAsyncResult ar) { GetTimeHandler calu = ar.AsyncState as GetTimeHandler; DateTime time = calu.EndInvoke(ar); //擷取函數傳回值 if (GetTimeCompleted != null) { GetTimeCompleted(this, new GetTimeCompletedEventArgs(time)); } } } }
|