static void Main(string[] args) { NewTaskDelegate task = NewTask; //无回调函数和函数的参数-BeginInvoke 默认后台运行,使线程异步的调用委托所执行的方法 IAsyncResult result = task.BeginInvoke(1000, null, null); //判断异步调用是否执行成功 //1. while (!result.IsCompleted) { Console.Write("*"); Thread.Sleep(1000); } //2. //while (!result.AsyncWaitHandle.WaitOne(100,false)) //{ // Console.Write("*"); //} //程序运行两秒输出结果 int resultStr = task.EndInvoke(result); Console.WriteLine(resultStr); Console.ReadKey(); }
static void Main(string[] args) { NewTaskDelegate task = newTask; IAsyncResult asyncResult = task.BeginInvoke(2000, null, null); // EndInvoke方法将被阻塞2秒 int result = task.EndInvoke(asyncResult); Console.WriteLine(result); }
static void Main(string[] args) { /* * //声明委托指向一个方法名 * NewTaskDelegate task = newTask; * * //在创建了此对象的线程上异步执行委托。 * //BeginInvoke创建的线程都是后台线程 * //这种线程一但所有的前台线程都退出后(其中主线程就是一个前台线程),不管后台线程是否执行完毕,都会结束线程,并退出程序 * IAsyncResult asyncResult = task.BeginInvoke(200, null, null); * * // EndInvoke方法将被阻塞2秒 * // 会卡死界面 * int result = task.EndInvoke(asyncResult); * Console.WriteLine(result); */ /* * NewTaskDelegate task = newTask; * IAsyncResult asyncResult = task.BeginInvoke(2000, null, null); * * //如果异步调用没有完成,就会执行该代码,一直输出,会给客户一种非常友好的方式 * while (!asyncResult.IsCompleted) * { * Console.Write("*"); * Thread.Sleep(100); * //由于是异步,所以“*”可能会在“任务开始”前输出 * } * * // 由于异步调用已经完成,因此, EndInvoke会立刻返回结果 * int result = task.EndInvoke(asyncResult); * Console.WriteLine(result); * //区别:界面代码还在运行,代码还在执行,给异步调用充分的时间执行,等它执行完毕 */ NewTaskDelegate task = newTask; IAsyncResult asyncResult = task.BeginInvoke(2000, null, null); //WaitOne的第一个参数表示要等待的毫秒数,在指定时间之内,WaitOne方法将一直等待,直到异步调用完成,并发出通知, //WaitOne方法才返回true。当等待指定时间之后,异步调用仍未完成,WaitOne方法返回false, //如果指定时间为0,表示不等待,如果为-1,表示永远等待,直到异步调用完成 while (!asyncResult.AsyncWaitHandle.WaitOne(100, false)) { Console.Write("*"); } int result = task.EndInvoke(asyncResult); Console.WriteLine(result); }
static void Main(string[] args) { Debug.WriteLine("Qoo1"); Debug.Print("TEst123"); Console.WriteLine("Qoo2"); string dateTime = "20150312122430"; DateTime d = DateTime.ParseExact(dateTime, "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture); NewTaskDelegate task = newTask; IAsyncResult asyncResult = task.BeginInvoke(2000, null, null); // EndInvoke方法将被阻塞2秒 int result = task.EndInvoke(asyncResult); Console.WriteLine(result); Console.ReadKey(); }
/* * 呼叫BeginInvoke方法時會建立一個執行緒來非同步執行newTask方法。 * 如果不呼叫EndInvoke方法,程式會立即退出,這是由於使用BeginInvoke建立的執行緒都是後臺執行緒, * 這種執行緒一但所有的前臺執行緒都退出後(其中主執行緒就是一個前臺執行緒), * 不管後臺執行緒是否執行完畢,都會結束執行緒,並退出程式。 */ public static void Main(string[] args) { NewTaskDelegate task = newTask; // IAsyncResult asyncResult = task.BeginInvoke(2000, null, null); // Without Callback Method // 如果被呼叫的方法含有parameter的話,這些引數將作為BeginInvoke的前面一部分引數。 // 如果沒有parameter, BeginInvoke就只需要傳兩個引數(Callback function, Delegate)。 IAsyncResult asyncResult = task.BeginInvoke(3000, Completed_Callback, task); // Pass a Callback Method Console.WriteLine("Main Thread EndInvoke Starts"); // Check if it's completed Method1: // 使用IAsyncResult asyncResult屬性來判斷非同步呼叫是否完成 // while (!asyncResult.IsCompleted) // { // Console.WriteLine("*** Main Thread waits for result ***"); // Thread.Sleep(100); // } // 由於非同步呼叫已經完成, 因此EndInvoke會立刻返回結果 // Check if it's completed Method2: // 使用WaitOne方法等待非同步方法執行完成 /* * WaitOne的第一個引數表示要等待的毫秒數,在指定時間之內,WaitOne方法將一直等待,直到非同步呼叫完成並發出通知,WaitOne方法才返回true。 * 當等待指定時間之後,非同步呼叫仍未完成,WaitOne方法返回false。 * 如果指定時間為0,表示不等待。 如果為-1,表示永遠等待,直到非同步呼叫完成。 */ // while (!asyncResult.AsyncWaitHandle.WaitOne(100, false)) // { // Console.WriteLine("*** Main Thread waits for result ***"); // } // int result = task.EndInvoke(asyncResult); // 如果方法尚未完成的話, EndInvoke方法會阻塞當前線程 // Console.WriteLine("Main Thread EndInvoke has completed"); // Console.WriteLine("Result: {0}", result); Console.ReadKey(); }