c# – 垃圾收集器是否在.NET中异步调用期间暂时删除未引用的对象?

前端之家收集整理的这篇文章主要介绍了c# – 垃圾收集器是否在.NET中异步调用期间暂时删除未引用的对象?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
想象一下,我将在.NET中进行异步调用,即HttpWebRequest.BeginGetResponse,并且HttpWebRequest对象在更广泛的范围内不被引用.垃圾收集器会毁灭它并造成问题吗?

示例代码

  1. using System;
  2. using System.Net;
  3.  
  4. public class AsyncHttpWebRequest
  5. {
  6. void Main()
  7. {
  8. var Request = HttpWebRequest.Create("http://www.contoso.com");
  9. var result = Request.BeginGetResponse(GetResponseCallback,null);
  10. }
  11.  
  12. private void GetResponseCallback(IAsyncResult AsyncResult)
  13. {
  14. // Do Something..
  15. }
  16. }

备用版本(请求作为AsyncState传递):

  1. using System;
  2. using System.Net;
  3.  
  4. public class AsyncHttpWebRequest
  5. {
  6. void Main()
  7. {
  8. var Request = HttpWebRequest.Create("http://www.contoso.com");
  9. var result = Request.BeginGetResponse(GetResponseCallback,Request);
  10. }
  11.  
  12. private void GetResponseCallback(IAsyncResult AsyncResult)
  13. {
  14. // Do Something..
  15. }
  16. }

解决方法

如果任何活动线程包含对其的引用,或者静态引用(在这两种情况下都是直接或间接引用),则该对象被认为是活动的且不符合垃圾回收的条件.

在这两个示例中,async API保留对您的请求的引用(在提供异步IO操作的线程池中),因此在完成之前不会垃圾回收.

猜你在找的C#相关文章