上面的例子可以看出,IAsyncResult 這個介面是關鍵。 我查閱了很多資料,發現提供這個介面的大部分是IO等操作。而且介面內部機制被.net封裝了,要反編譯才能看見。 這樣,實際上asp.net的非同步作業被asp.net限制住在幾個方面了(Stream/Web Service ...)
Reference:Using asynchronous method calls in C#http://www.builderau.com.au/program/java/soa/Using_asynchronous_method_calls_in_C_/0,339024620,320264369,00.htm
調用過程:
void Page_Load (object sender, EventArgs e)
{
AddOnPreRenderCompleteAsync (
new BeginEventHandler(BeginAsyncOperation),
new EndEventHandler (EndAsyncOperation)
);
}
IAsyncResult BeginAsyncOperation (object sender, EventArgs e,
AsyncCallback cb, object state)
{
//省略
}
void EndAsyncOperation (IAsyncResult ar)
{
//省略
}
IAsyncResult 介面描述: // 摘要:
// 表示非同步作業的狀態。
[ComVisible(true)]
public interface IAsyncResult
{
// 摘要:
// 擷取使用者定義物件,它限定或包含關於非同步作業的資訊。
//
// 返回結果:
// 使用者定義物件,它限定或包含關於非同步作業的資訊。
object AsyncState { get; }
//
// 摘要:
// 擷取用於等待非同步作業完成的 System.Threading.WaitHandle。
//
// 返回結果:
// 用於等待非同步作業完成的 System.Threading.WaitHandle。
WaitHandle AsyncWaitHandle { get; }
//
// 摘要:
// 擷取非同步作業是否同步完成的指示。
//
// 返回結果:
// 如果非同步作業同步完成,則為 true;否則為 false。
bool CompletedSynchronously { get; }
//
// 摘要:
// 擷取非同步作業是否已完成的指示。
//
// 返回結果:
// 如果操作完成則為 true,否則為 false。
bool IsCompleted { get; }
}
上面是一個介面的描述。。AsyncState返回的值與調用過程中BeginAsyncOperation (object sender, EventArgs e, AsyncCallback cb, object state)的state一樣。。AsyncWaitHandle:就是多個線程操作時候控制用的。例如非同步中我開了n個線程平行操作,我需要所有線程完成的時候才返回,就使用這個。。CompletedSynchronously表示我的操作是否實際上已經同步完成了(True)。當然如果是非同步就false。IsCompleted 表示非同步作業是否完成。