Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

156
Visualizações
¿Qué sucede con las tareas programadas pero nunca ejecutadas?

Vea el siguiente ejemplo:

 public static void ForgottenTask() { Action<object> action = (object obj) => { Console.WriteLine("Task={0}, obj={1}, Thread={2}", Task.CurrentId, obj, Thread.CurrentThread.ManagedThreadId); }; new Task(action, "alpha").ContinueWith(action); }
 static void Main(string[] args) { for (int i = 0; i < 1000000; i++) ForgottenTask(); GC.Collect(); GC.Collect(); Debugger.Break(); }

Obviamente, nunca se ejecuta ninguna acción y eso es lo que se espera. Lo que es extraño es que cuando compruebo las tareas durante Debugger.Break a través del menú -> Depurar -> Windows> Tareas/Pilas paralelas (en Visual Studio 2022; no conozco una forma más fácil), veo 10 000 de ellas en ' Estado "programado". No estoy seguro de si se trata del límite de depuración o del programador. Así que ahí está mi primera pregunta, ¿por qué 10 000?

De todos modos, las tareas no se recolectan como basura, lo que podría esperarse ya que tienen referencia en TaskScheduler. Pero mi pregunta es ¿qué pasará con ellos? ¿Se colgarán allí para siempre (suena como una pérdida de memoria)? ¿O serán reutilizados / eliminados de alguna manera? Si es así, ¿cuándo y cómo?

Usé .NET 6 y VS 2022 en el ejemplo (si eso es relevante)

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

No sé mucho sobre las implicaciones del uso de las funciones de depuración de Visual Studio, pero si ejecuta su programa sin el depurador adjunto (con Ctrl + F5), el recolector de basura recicla correctamente las tareas. Las tareas creadas internamente por el método ForgottenTask no se inician, por lo que no se programan y, dado que no tiene ninguna referencia explícita a las tareas, no hay nada que impida que el recolector de elementos no utilizados las recicle. Aquí hay una demostración mínima de este comportamiento:

 using System; using System.Threading.Tasks; public class Program { public static void Main() { var weakReference = ForgottenTask(); Console.WriteLine($"Before GC.Collect, IsAlive: {weakReference.IsAlive}"); GC.Collect(); Console.WriteLine($"After GC.Collect, IsAlive: {weakReference.IsAlive}"); } static WeakReference ForgottenTask() { var task = new Task(() => { }).ContinueWith(_ => { }); return new WeakReference(task); } }

Producción:

 Before GC.Collect, IsAlive: True After GC.Collect, IsAlive: False

Pruébalo en Fiddle .

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda