startnew run parallel net library example asp c# .net multithreading .net-4.0 taskfactory

run - task startnew c#



bajando la prioridad del hilo Task.Factory.StartNew (4)

Como han mencionado otros, debe especificar un planificador personalizado para que se ajuste a su tarea. Lamentablemente, no existe un planificador integrado adecuado.

Puedes ir a ParallelExtensionsExtras a los que Glenn se vinculó, pero si quieres algo simple que pueda pegarse directamente en tu código, prueba lo siguiente. Use esto:

Task.Factory.StartNew(() => { // everything here will be executed in a thread whose priority is BelowNormal }, null, TaskCreationOptions.None, PriorityScheduler.BelowNormal);

El código:

public class PriorityScheduler : TaskScheduler { public static PriorityScheduler AboveNormal = new PriorityScheduler(ThreadPriority.AboveNormal); public static PriorityScheduler BelowNormal = new PriorityScheduler(ThreadPriority.BelowNormal); public static PriorityScheduler Lowest = new PriorityScheduler(ThreadPriority.Lowest); private BlockingCollection<Task> _tasks = new BlockingCollection<Task>(); private Thread[] _threads; private ThreadPriority _priority; private readonly int _maximumConcurrencyLevel = Math.Max(1, Environment.ProcessorCount); public PriorityScheduler(ThreadPriority priority) { _priority = priority; } public override int MaximumConcurrencyLevel { get { return _maximumConcurrencyLevel; } } protected override IEnumerable<Task> GetScheduledTasks() { return _tasks; } protected override void QueueTask(Task task) { _tasks.Add(task); if (_threads == null) { _threads = new Thread[_maximumConcurrencyLevel]; for (int i = 0; i < _threads.Length; i++) { int local = i; _threads[i] = new Thread(() => { foreach (Task t in _tasks.GetConsumingEnumerable()) base.TryExecuteTask(t); }); _threads[i].Name = string.Format("PriorityScheduler: ", i); _threads[i].Priority = _priority; _threads[i].IsBackground = true; _threads[i].Start(); } } } protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued) { return false; // we might not want to execute task that should schedule as high or low priority inline } }

Notas:

  • los subprocesos de trabajo son todos subprocesos en segundo plano, por lo que las tareas importantes no deben programarse utilizando este programador; solo aquellos que pueden descartarse si el proceso se cierra
  • Adaptado de una implementación por Bnaya Eshet.
  • No entiendo completamente cada anulación; simplemente yendo con las opciones de MaximumConcurrencyLevel para MaximumConcurrencyLevel , GetScheduledTasks y TryExecuteTaskInline .

un código como el siguiente iniciará un nuevo hilo para hacer el trabajo. ¿Hay alguna manera de que pueda controlar la prioridad de ese hilo?

Task.Factory.StartNew(() => { // everything here will be executed in a new thread. // I want to set the priority of this thread to BelowNormal });


Este es uno de "no hacer" cuando decides si usar el grupo de subprocesos o no ;-)

Más detalles aquí: http://msdn.microsoft.com/en-us/library/0ka9477y.aspx

Entonces, la respuesta es "No, no puedes especificar una prioridad particular para el hilo creado en Theads Pool"

A partir de subprocesos generales, apuesto a que ya sabes sobre la propiedad Thread.Priority


La prioridad de subproceso para las tareas se puede establecer dentro del método real que ejecuta la tarea. Pero no olvide restaurar la prioridad una vez que haya terminado para evitar problemas.

Entonces primero comienza la Tarea:

new TaskFactory().StartNew(StartTaskMethod);

Luego configure la prioridad del hilo:

void StartTaskMethod() { try { // Change the thread priority to the one required. Thread.CurrentThread.Priority = ThreadPriority.AboveNormal; // Execute the task logic. DoSomething(); } finally { // Restore the thread default priority. Thread.CurrentThread.Priority = ThreadPriority.Normal; } }

Al cambiar la prioridad, tenga en cuenta esto: ¿Por qué * no * cambia la prioridad de un hilo ThreadPool (o tarea)?


Para establecer la prioridad con Task , consulte los programadores de tareas personalizados descritos por el experto de Microsoft Stephen Toub en esta publicación de blog de MSDN . Para más detalles, no se pierda los enlaces a las dos publicaciones anteriores que menciona en la primera oración.

Para su problema, suena como si quisiera ver el QueuedTaskScheduler .