На веб-странице я звоню третьей стороне, которая не позволяет мне устанавливать таймаут программно. Я вызываю 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