In una pagina Web, sto chiamando una terza parte che non mi consente di impostare il timeout in modo programmatico. Chiamo BeginInvoke e uso AsyncWaitHandle.WaitOne per aspettare un intervallo di tempo specificato.Devo chiamare EndInvoke dopo un timeout?
Se la chiamata scade, vado avanti e mi dimentico della chiamata al thread che ho iniziato. La mia domanda è, devo ancora chiamare EndInvoke in qualche modo in una situazione di timeout? L'osservazione "ATTENZIONE" su questa pagina MSDN mi chiede se dovrei: http://msdn.microsoft.com/en-us/library/2e08f6yc(VS.71).aspx
Se credi che dovrei, la prossima domanda è se la mia pagina web viene elaborata e ritorna al client prima che la terza parte ritorni , il metodo di callback sarebbe anche lì in ascolto per eseguire il codice? Il server non smette di cercare attività una volta che la mia richiesta/risposta è stata eseguita?
Ecco il codice che sto utilizzando:
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;
}
}
Per quanto riguarda la richiesta-risposta: se mi passa un metodo di callback, ma nel frattempo completare la mia funzione ButtonClick e tornare al cliente, è lì qualcuno che ascolta quando restituisce quel thread BeginInvoke? In un'app locale, se Main() ha terminato e chiuso l'app, la funzione di callback non è mai stata attivata. – Chad