En una página web, estoy llamando a un tercero que no me permite establecer el tiempo de espera programáticamente. Llamo a BeginInvoke y uso AsyncWaitHandle.WaitOne para esperar una cantidad específica de tiempo.¿Debo llamar a EndInvoke después de un tiempo de espera?
Si la llamada se agota, sigo adelante y me olvido de la llamada al hilo que comencé. Mi pregunta es, ¿todavía tengo que llamar a EndInvoke de alguna manera en una situación de tiempo de espera? El comentario "PRECAUCIÓN" en esta página de MSDN hace que me pregunte si debería: http://msdn.microsoft.com/en-us/library/2e08f6yc(VS.71).aspx
Si usted cree que debería, a continuación, la siguiente pregunta es si mi página Web por el procesamiento y vuelve al cliente antes de que el tercero vuelve , ¿el método de devolución de llamada estaría allí incluso escuchando ejecutar el código? ¿El servidor no deja de buscar actividad una vez que se realiza mi solicitud/respuesta?
Aquí está el código que estoy usando:
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;
}
}
En cuanto a la petición-respuesta: si paso un método de devolución de llamada, pero en la media hora de completar mi función ButtonClick y volver a cliente, ¿hay ¿Alguien escucha cuando regresa ese hilo de BeginInvoke? En una aplicación local, si Main() finalizó y cerró la aplicación, la devolución de llamada nunca se activó. – Chad