La solución que funcionó para mí fue enviar el TaskScheduler como una dependencia del código que quiero probar de la unidad (por ej.
MyClass(TaskScheduler asyncScheduler, TaskScheduler guiScheduler)
Donde asyncScheduler se utiliza para programar tareas que se ejecutan en subprocesos de trabajo (llamadas de bloqueo) y guiScheduler se utiliza para programar tareas que deben ejecutarse en la GUI (llamadas no bloqueadas).
En la prueba unitaria, me gustaría inyectar un planificador específico, es decir instancias de CurrentThreadTaskScheduler. CurrentThreadTaskScheduler es una implementación del planificador que ejecuta las tareas de forma inmediata, en lugar de ponerlas en cola.
Puede encontrar la implementación en las muestras de Microsoft para la programación paralela here.
voy a pegar el código de referencia rápida:
/// <summary>Provides a task scheduler that runs tasks on the current thread.</summary>
public sealed class CurrentThreadTaskScheduler : TaskScheduler
{
/// <summary>Runs the provided Task synchronously on the current thread.</summary>
/// <param name="task">The task to be executed.</param>
protected override void QueueTask(Task task)
{
TryExecuteTask(task);
}
/// <summary>Runs the provided Task synchronously on the current thread.</summary>
/// <param name="task">The task to be executed.</param>
/// <param name="taskWasPreviouslyQueued">Whether the Task was previously queued to the scheduler.</param>
/// <returns>True if the Task was successfully executed; otherwise, false.</returns>
protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)
{
return TryExecuteTask(task);
}
/// <summary>Gets the Tasks currently scheduled to this scheduler.</summary>
/// <returns>An empty enumerable, as Tasks are never queued, only executed.</returns>
protected override IEnumerable<Task> GetScheduledTasks()
{
return Enumerable.Empty<Task>();
}
/// <summary>Gets the maximum degree of parallelism for this scheduler.</summary>
public override int MaximumConcurrencyLevel { get { return 1; } }
}
¿Qué está implementando 'ConcurrentList