Usar la espera de la tarea intensiva no CPU
-
22-10-2019 - |
Pregunta
Tengo algo como esto:
private void DoSomething()
{
System.Console.WriteLine("Creating Foo");
Foo result = new Foo();
DoSomethingAsync();
System.Console.WriteLine("Returning Foo");
return result;
}
private async void DoSomethingAsync()
{
// The following task takes a long time, but is not CPU intensive
await TaskEx.Run(() =>
{
// code lives here... removed for this example
});
}
Como no llego mucho a la CPU, no necesito un hilo. ¿Qué puedo usar en lugar de correr para evitar la creación de un hilo?
Solución
Creo que estás malinterpretando la intención del patrón de asincronía de tareas aquí. Lo que estás haciendo probablemente sea mejor manejado por ThreadPool.QueueUserWorkItem
que reutilizará un hilo de trabajador del grupo del proceso, solo creando uno si es necesario.
El TAP le permite dividir una tarea en "trozos" de trabajo que se pueden procesar de forma incremental, pero no proporciona directamente un medio para decir "Esta es una tarea de fondo".
Otros consejos
Depende de la tarea que esté haciendo. Como dices que no usa mucha CPU, asumiré que la tarea lleva mucho tiempo porque está esperando otros eventos. Por lo tanto, deberá diseñar su tarea para registrar devoluciones de llamada para esos eventos, donde cada devolución de llamada se completa rápidamente en el hilo principal, pero no se activa hasta que ocurra el evento que está esperando.