您的異步教程給了我很多啟示,我按照您的提示並參考了MSDN的文章,
實作後,我有兩點疑惑,盼能替我解答!
問題一,請看如下代碼,它是執行異步回調阻塞操作的,但是我偵錯時發現:
正常執行時根本沒有進入到回調的函數,程式執行完Console.WriteLine("--The Main Method was ended at:"+System.DateTime.Now);後便直接退出來了。
但是如是在Console.WriteLine("--The Main Method was ended at:"+System.DateTime.Now);設置斷點,並在該位置停6秒,
則程式會進入該斷點。
請問這個情況正常嗎?原因是什麼呢?
問題二,我在MSDN的那份文件上看到這樣一句話:警告:始終在異步調用完成後調用EndInvoke().
我在實際測試時,發現我若不使用回調時,可以處理一種情況:當我對異步方法的結果沒有要求時。
即我啟動異步方法後就不再管它了。
請問這樣做是否可以?MSDN的那段警告的原因是什麼?
using System;
namespace WindowsApplication1
{
/// <summary>
/// Async2 的摘要描述。
/// C#中異步回調,調用方法後,由異步方法Handle通知主程序。
///
/// </summary>
public delegate void AsynCall(int iTime);
public class Async2
{
public Async2()
{
//
// TODO: 在此加入建構函式的程式碼
//
}
public void MyMethod1(int iTime)
{
Console.WriteLine("--MyMethod Begin");
System.Threading.Thread.Sleep(iTime);
Console.WriteLine("Now is:"+System.DateTime.Now);
Console.WriteLine("--MyMethod End");
}
public void MyAsync(int iTime)
{
Console.WriteLine("**MyAsync Begin");
System.Threading.Thread.Sleep(iTime);
Console.WriteLine("Now is:"+System.DateTime.Now);
Console.WriteLine("**MyAsync End");
}
public void AsyncHandle(IAsyncResult iar)
{
//while(!iar.IsCompleted)
//System.Threading.Thread.Sleep(10);
if(iar.IsCompleted)
{
Console.WriteLine("Async Handle found the Async is end!");
AsynCall ac=(AsynCall)iar.AsyncState;
ac.EndInvoke(iar);
}
}
///*
[STAThread]
public static void Main()
{
Async2 x=new Async2();
Console.WriteLine("Now is:"+System.DateTime.Now);
AsynCall ac=new AsynCall(x.MyAsync);
AsyncCallback acb=new AsyncCallback(x.AsyncHandle);//定義Handle
IAsyncResult iar=ac.BeginInvoke( 6000,acb,ac);//開始執行異步,並轉交Handle.
x.MyMethod1(2000);
Console.WriteLine("--The Main Method was ended at:"+System.DateTime.Now);
}
//*/
}
}