c# - recolección - ¿El recolector de basura destruye temporalmente los objetos sin referencia durante las llamadas asincrónicas en.NET?
recolector de basura programacion (5)
El objeto permanece referenciado muy bien, mediante la implementación de llamadas asíncronas, que necesita mantener una lista de todas las solicitudes abiertas, para correlacionar los datos entrantes con las solicitudes. Lo más probable es que .NET use una variable global (o de clase) para almacenar las solicitudes.
Imagine que haré una llamada asincrónica en .NET, es decir, HttpWebRequest.BeginGetResponse, y el objeto HttpWebRequest no se referencia en un ámbito más amplio. ¿El recolector de basura lo destruirá y causará problemas?
Código de ejemplo:
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..
}
}
Versión alternativa (con la solicitud aprobada como 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..
}
}
En el primer código de ejemplo, ¿por qué creas Solicitud, si no la usas?
De todos modos, si no existe ninguna referencia (directa o indirecta) a un objeto de cualquiera de los objetos actualmente en alcance, el GC puede recopilarlo.
Por lo tanto, en su primer ejemplo, cuando el programa sale del método principal, la solicitud todavía está dentro del alcance (en otro hilo) por lo que no se recopilará hasta que finalice la llamada asíncrona. En el segundo ejemplo, tanto el subproceso de grupo de subprocesos como el código mantienen una referencia a su objeto, por lo que obviamente no se recopilará también.
No, el recolector de basura no te causará problemas.
No asuma que porque no tiene acceso al objeto, el recolector de basura lo va a limpiar.
El recolector de basura comienza con una cantidad de "raíces": objetos y referencias que son conocidos como alcanzables. Entonces, se encuentran todos los objetos accesibles desde esas raíces, y todo lo demás se recoge.
Cada hilo en ejecución, incluidos los hilos que procesan las llamadas asincrónicas, se incluyen en la lista de raíces.
Si un objeto no tiene referencias en lo que respecta al GC, ya no podrá obtener una referencia. Entonces no puedes tener un objeto que temporalmente no tenga una referencia a él.
(Esto no supone nada furtivo como juegos de código no administrados o inseguros)
Un objeto se considera vivo y no elegible para la recolección de elementos no utilizados si algún hilo activo contiene una referencia al mismo, o si se lo referencia estáticamente (directa o indirectamente en ambos casos).
En ambos ejemplos, la API asíncrona mantiene una referencia a su solicitud (dentro del grupo de subprocesos donde se alojan las operaciones de E / S asíncronas) y, por lo tanto, no se recolectará basura hasta que se complete.