四、使用IAsyncResult asyncResult屬性來判斷異步調用是否完成
雖然上面的方法可以很好地實現異步調用,但是當調用EndInvoke方法獲得調用結果時,整個程序就象死了一樣,這樣做用戶的感覺並不會太好,因此,我們可以使用asyncResult來判斷異步調用是否完成,並顯示一些提示信息。這樣做可以增加用戶體驗。代碼如下:
static void Main(string[] args)
{
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);
}
上面代碼的執行結果如下圖所示。
由於是異步,所以“*”可能會在“任務開始”前輸出,如上圖所示。
五、使用WaitOne方法等待異步方法執行完成
使用WaitOne方法是另外一種判斷異步調用是否完成的方法。代碼如下:
static void Main(string[] args)
{
NewTaskDelegate task = newTask;
IAsyncResult asyncResult = task.BeginInvoke(2000, null, null);
while (!asyncResult.AsyncWaitHandle.WaitOne(100, false))
{
Console.Write("*");
}
int result = task.EndInvoke(asyncResult);
Console.WriteLine(result);
}
WaitOne的第一個參數表示要等待的毫秒數,在指定時間之內,WaitOne方法將一直等待,直到異步調用完成,並發出通知,WaitOne方法才返回true。當等待指定時間之後,異步調用仍未完成,WaitOne方法返回false,如果指定時間為0,表示不等待,如果為-1,表示永遠等待,直到異步調用完成。