想象一下,我将在.NET中进行异步调用,即HttpWebRequest.BeginGetResponse,并且不会在更广泛的范围内引用HttpWebRequest对象.垃圾收集器会破坏它并导致问题吗?
示例代码:
using System; using System.Net; public class AsyncHttpWebRequest { void Main() { var Request = HttpWebRequest.Create("http://www.contoso.com"); var result = Request.BeginGetResponse(GetResponseCallback, null); } private void GetResponseCallback(IAsyncResult AsyncResult) { // Do Something.. } }
备用版本(请求作为AsyncState传递):
using System; using System.Net; public class AsyncHttpWebRequest { void Main() { var Request = HttpWebRequest.Create("http://www.contoso.com"); var result = Request.BeginGetResponse(GetResponseCallback, Request); } private void GetResponseCallback(IAsyncResult AsyncResult) { // Do Something.. } }
Drew Noakes.. 11
如果任何活动线程包含对它的引用,或者它是静态引用(在两种情况下都直接或间接引用),则该对象被视为活动且不符合垃圾回收条件.
在这两个示例中,异步API都会保留对您的请求的引用(在提供异步IO操作的线程池中),因此在完成之前不会对其进行垃圾回收.
如果任何活动线程包含对它的引用,或者它是静态引用(在两种情况下都直接或间接引用),则该对象被视为活动且不符合垃圾回收条件.
在这两个示例中,异步API都会保留对您的请求的引用(在提供异步IO操作的线程池中),因此在完成之前不会对其进行垃圾回收.