我見過兩種口味的mvc控制器中的異步操作。等待或不等待一個AsyncController的異步方法
第一:
public void GetNewsAsync()
{
AsyncManager.OutstandingOperations.Increment();
using (ManualResetEvent mre = new ManualResetEvent(false))
{
//Perform the actual operation in a worker thread
ThreadPool.QueueUserWorkItem((object _mre) =>
{
//do some work in GetFeed that takes a long time
var feed = GetFeed();
AsyncManager.Parameters["Feed"] = feed;
AsyncManager.OutstandingOperations.Decrement();
mre.Set();
}, mre);
//Wait for the worker thread to finish
mre.WaitOne(TimeSpan.FromSeconds(SomeNumberOfSecondsToWait));
}
}
第二:
public void GetNewsAsync()
{
AsyncManager.OutstandingOperations.Increment();
//Perform the actual operation in a worker thread
ThreadPool.QueueUserWorkItem((object x) =>
{
//do some work in GetFeed that takes a long time
var feed = GetFeed();
AsyncManager.Parameters["Feed"] = feed;
AsyncManager.OutstandingOperations.Decrement();
}, null);
}
第一塊GetNewsAsync爲SomeNumberOfSecondsToWait,第二不。兩者都在一個工作者線程中執行工作,並將結果傳遞給GetNewsCompleted。
所以我的問題是,這是處理GetNews的Ajax調用的正確方法;等等,還是不要等待?
GetFeed不一定必須是阻塞調用,它可能有它自己的定時/超時處理。重點是,可能需要1秒鐘的時間才能返回,或者1分鐘。至於第一個的使用,我在使用ajax長輪詢的聊天服務器的實現中看到了它,就像彗星一樣。 –
@PaulRivera,如果'GetFeed'是一個非阻塞的調用,你將無法像調用第二個示例那樣在調用它之後立即使用它的結果。在調用'GetFeed'之後,您將無法立即將'feed'結果分配給'AsyncManager.Parameters'。非阻塞API與回調一起工作。它不返回結果。所以'GetFeed'被阻塞或者你的第二個例子不正確。 –
好的,所以GetFeed會在等待發生的情況下阻塞x秒。我真正需要知道的是,第一個例子是否正確,特別是對於ajax長輪詢場景。我的意思是,如果在Async方法中沒有Wait,那麼可以肯定地說ajax調用在Completed方法返回數據之前不會返回? –