Todo, estoy intentando cancelar dos HttpWebRequests simultáneas utilizando un método similar al código siguiente (mostrado en pseudo-ish C#).Asesinato del objeto HttpWebRequest utilizando Thread.Abort
El método Principal crea dos hilos que crean HttpWebRequests. Si el usuario lo desea, puede cancelar las solicitudes haciendo clic en un botón que luego llama al método Abortar.
private Thread first;
private Thread second;
private string uri = "http://somewhere";
public void Main()
{
first = new Thread(GetFirst);
first.Start();
second = new Thread(GetSecond);
second.Start();
// Some block on threads... like the Countdown class
countdown.Wait();
}
public void Abort()
{
try
{
first.Abort();
}
catch { // do nothing }
try
{
second.Abort();
}
catch { // do nothing }
}
private void GetFirst(object state)
{
MyHandler h = new MyHandler(uri);
h.RunRequest();
}
private void GetSecond(object state)
{
MyHandler h = new MyHandler(uri);
h.RunRequest();
}
El primer hilo se interrumpe por un SocketException:
A blocking operation was interrupted by a call to WSACancelBlockingCall
El segundo hilo se cuelga en GetResponse().
¿Cómo puedo cancelar ambas solicitudes de forma que el servidor web sepa que la conexión se ha cancelado?, y/o, ¿Hay una mejor manera de hacer esto?
ACTUALIZACIÓN
Como se ha sugerido, una buena alternativa sería utilizar BeginGetResponse. Sin embargo, no tengo acceso al objeto HttpWebRequest; se abstrae en la clase MyHandler
. He modificado la pregunta para mostrar esto.
public class MyHandler
{
public void RunRequest(string uri)
{
HttpWebRequest req = HttpWebRequest.Create(uri);
HttpWebResponse res = req.GetResponse();
}
}
Desafortunadamente, todo lo que puedo ofrecer como respuesta es modificar MyHandler si tiene acceso. De lo contrario, la única forma de matarlo es cómo lo está haciendo actualmente. Alternativamente, puede proporcionar un tiempo de espera utilizando la opción HttpWebRequest.Timeout: http: //msdn.microsoft.com/en-us/library/system.net.httpwebrequest.timeout.aspx –