Alles, ich versuche, zwei gleichzeitige HttpWebRequests mit einer Methode ähnlich dem folgenden Code (in Pseudo-ish C# gezeigt) abzubrechen.Killing HttpWebRequest Objekt mit Thread.Abort
Die Main-Methode erstellt zwei Threads, die HttpWebRequests erstellen. Wenn der Benutzer dies wünscht, kann er die Anfragen durch Anklicken einer Schaltfläche abbrechen, die dann die Abort-Methode aufruft.
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();
}
Der erste Thread bekommt durch eine Socket unterbrochen:
A blocking operation was interrupted by a call to WSACancelBlockingCall
Der zweite Faden hängt an GetResponse().
Wie kann ich beide Anfragen so abbrechen, dass der Webserver weiß, dass die Verbindung abgebrochen wurde? und/oder Gibt es einen besseren Weg, dies zu tun?
UPDATE
Wie bereits angedeutet, wäre eine gute Alternative sein BeginGetResponse zu verwenden. Ich habe jedoch keinen Zugriff auf das HttpWebRequest-Objekt - es ist in der Klasse MyHandler
abstrahiert. Ich habe die Frage geändert, um dies zu zeigen.
public class MyHandler
{
public void RunRequest(string uri)
{
HttpWebRequest req = HttpWebRequest.Create(uri);
HttpWebResponse res = req.GetResponse();
}
}
Leider kann ich als Antwort darauf MyHandler nur ändern, wenn Sie darauf zugreifen können. Ansonsten ist der einzige Weg, um es zu töten, wie Sie es gerade tun. Alternativ können Sie ein Timeout mit der Option HttpWebRequest.Timeout angeben: http: //msdn.microsoft.com/en-us/library/system.net.httpwebrequest.timeout.aspx –