come altri hanno menzionato, è necessario specificare un programma di pianificazione personalizzato per andare con il vostro compito. Sfortunatamente non esiste un programmatore incorporato adatto.
Si potrebbe optare per ParallelExtensionsExtras a cui è collegato Glenn, ma se si desidera qualcosa di semplice da incollare nel codice, provare quanto segue. Utilizzare questo modo:
Task.Factory.StartNew(() => {
// everything here will be executed in a thread whose priority is BelowNormal
}, null, TaskCreationOptions.None, PriorityScheduler.BelowNormal);
Il codice:
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
}
}
Note:
- i thread di lavoro sono tutti i thread in background, in modo da compiti importanti non dovrebbero essere programmate utilizzando questo scheduler; solo quelli che possono essere scartati se il processo si arresta
- adattato da an implementation by Bnaya Eshet
- Non capisco completamente ogni intervento; solo andando con le scelte di Bnaya per
MaximumConcurrencyLevel
, GetScheduledTasks
e TryExecuteTaskInline
.
fonte
2012-01-29 20:56:47
Sì, so di Thread.Priority. Ma volevo solo sapere se era possibile con Task Factory invece di usare gli oggetti di Thread. – Moon
Al primo collegamento è la descrizione che dice che non è possibile con Task Factory.Ad ogni modo non ho mai bisogno di cambiare priorità per i thread del pool e non sono sicuro al 100% che sia vero. – zerkms