Tất cả, tôi đang cố gắng hủy hai HttpWebRequests đồng thời bằng một phương thức tương tự như mã bên dưới (được hiển thị trong giả C#).Giết HttpWebRequest đối tượng bằng cách sử dụng Thread.Abort
Phương pháp chính tạo hai luồng tạo HttpWebRequests. Nếu người dùng muốn, họ có thể hủy bỏ các yêu cầu bằng cách nhấp vào một nút mà sau đó gọi phương pháp Abort.
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();
}
Các chủ đề đầu tiên bị gián đoạn bởi một SocketException:
A blocking operation was interrupted by a call to WSACancelBlockingCall
Các chủ đề thứ hai treo trên GetResponse().
Làm cách nào để hủy bỏ cả hai yêu cầu này theo cách mà máy chủ web biết rằng kết nối đã bị hủy? và/hoặc, Có cách nào tốt hơn để thực hiện việc này không?
CẬP NHẬT
Như đã đề cập, một lựa chọn tốt sẽ được sử dụng BeginGetResponse. Tuy nhiên, tôi không có quyền truy cập vào đối tượng HttpWebRequest - nó được tóm tắt trong lớp MyHandler
. Tôi đã sửa đổi câu hỏi để hiển thị điều này.
public class MyHandler
{
public void RunRequest(string uri)
{
HttpWebRequest req = HttpWebRequest.Create(uri);
HttpWebResponse res = req.GetResponse();
}
}
Thật không may, tất cả những gì tôi có thể cung cấp như là một câu trả lời cho điều đó là sửa đổi MyHandler nếu bạn có quyền truy cập vào nó. Nếu không, cách duy nhất để giết nó là cách bạn hiện đang thực hiện nó. Ngoài ra, bạn có thể cung cấp thời gian chờ bằng cách sử dụng tùy chọn HttpWebRequest.Timeout: http: //msdn.microsoft.com/en-us/library/system.net.httpwebrequest.timeout.aspx –