在網頁上,我打電話給不允許我以編程方式設置超時的第三方。我調用BeginInvoke並使用AsyncWaitHandle.WaitOne等待指定的時間。超時後我需要調用EndInvoke嗎?
如果通話超時,我繼續前進,並忘記了我開始的線程調用。我的問題是,我是否仍然需要在超時情況下以某種方式調用EndInvoke?在此MSDN頁面上的「注意」備註讓我想知道我是否應該:http://msdn.microsoft.com/en-us/library/2e08f6yc(VS.71).aspx
如果您認爲我應該,那麼接下來的問題是如果我的網頁在第三方回來之前完成處理並返回到客戶端,回調方法甚至會在那裏偵聽運行代碼?一旦我的請求/響應完成,服務器不會停止尋找活動嗎?
下面是我使用的代碼:
public class RemotePaymentProcessor
{
private delegate string SendProcessPaymentDelegate(string creditCardNumber);
private string SendProcessPayment(string creditCardNumber)
{
string response = string.Empty;
// call web service
SlowResponseService.SlowResponseService srs = new WebServiceTimeout.SlowResponseService.SlowResponseService();
response = srs.GetSlowResponse(creditCardNumber);
return response;
}
public string ProcessPayment(string creditCardNumber, int timeoutMilliseconds)
{
string response = string.Empty;
SendProcessPaymentDelegate sppd = new SendProcessPaymentDelegate(SendProcessPayment);
IAsyncResult ar = sppd.BeginInvoke(creditCardNumber, null, new object());
if (!ar.AsyncWaitHandle.WaitOne(timeoutMilliseconds, false))
{
// Async call did not return before timeout
response = "TIMEOUT";
}
else
{
// Async call has returned - get response
response = sppd.EndInvoke(ar);
}
return response;
}
}
關於請求 - 響應:如果我傳遞一個回調方法,但在平均時間完成我的buttonclick功能,並返回到客戶端,有沒有任何人在BeginInvoke線程返回時監聽?在本地應用程序中,如果Main()完成並關閉應用程序,則回調從未被觸發。 – Chad 2009-02-17 18:28:21