c# – 使用Thread.Abort杀死HttpWebRequest对象

前端之家收集整理的这篇文章主要介绍了c# – 使用Thread.Abort杀死HttpWebRequest对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所有,我试图使用类似于下面的代码方法取消两个并发的HttpWebRequests(以伪ish C#显示).

Main方法创建两个创建HttpWebRequests的线程.如果用户希望,他们可以通过单击按钮然后调用Abort方法来中止请求.

  1. private Thread first;
  2. private Thread second;
  3. private string uri = "http://somewhere";
  4.  
  5. public void Main()
  6. {
  7. first = new Thread(GetFirst);
  8. first.Start();
  9.  
  10. second = new Thread(GetSecond);
  11. second.Start();
  12.  
  13. // Some block on threads... like the Countdown class
  14. countdown.Wait();
  15. }
  16.  
  17. public void Abort()
  18. {
  19. try
  20. {
  21. first.Abort();
  22. }
  23. catch { // do nothing }
  24.  
  25. try
  26. {
  27. second.Abort();
  28. }
  29. catch { // do nothing }
  30. }
  31.  
  32. private void GetFirst(object state)
  33. {
  34. MyHandler h = new MyHandler(uri);
  35. h.RunRequest();
  36. }
  37.  
  38. private void GetSecond(object state)
  39. {
  40. MyHandler h = new MyHandler(uri);
  41. h.RunRequest();
  42. }

第一个线程被SocketException中断:

  1. A blocking operation was interrupted by a call to WSACancelBlockingCall

第二个线程挂起在GetResponse()上.

如何以Web服务器知道连接已中止的方式中止这两个请求?和/或,是否有更好的方法来执行此操作?

UPDATE

正如所建议的,一个很好的选择是使用BeginGetResponse.但是,我无法访问HttpWebRequest对象 – 它在MyHandler类中被抽象化.我修改了这个问题来证明这一点.

  1. public class MyHandler
  2. {
  3. public void RunRequest(string uri)
  4. {
  5. HttpWebRequest req = HttpWebRequest.Create(uri);
  6. HttpWebResponse res = req.GetResponse();
  7. }
  8. }

解决方法

使用BeginGetResponse启动调用,然后使用类上的Abort方法取消它.

http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest_methods.aspx

我相信Abort不能使用同步GetResponse:

http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.abort.aspx

如果你必须坚持同步版本,要杀死这种情况,你所能做的只是中止线程.要放弃等待,您可以指定超时:

http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.timeout.aspx

如果你需要杀死进程,我会争辩在新的AppDomain中启动它并在你想杀死请求时删除AppDomain;而不是在主进程中中止一个线程.

猜你在找的C#相关文章