2012-10-05 33 views
0

我想獲得當前正在執行的任務,我正在添加在阻塞隊列中,它是如何完成的?如何在C#的阻塞隊列中獲取當前正在運行的任務?

編輯:我使用這個優先級調度,並加入多任務不同的優先級:

public class PriorityScheduler : TaskScheduler 
{ 
    public static PriorityScheduler Highest = new PriorityScheduler(ThreadPriority.Highest); 
    public static PriorityScheduler AboveNormal = new PriorityScheduler(ThreadPriority.AboveNormal); 
    public static PriorityScheduler Normal = new PriorityScheduler(ThreadPriority.Normal); 
    public static PriorityScheduler BelowNormal = new PriorityScheduler(ThreadPriority.BelowNormal); 
    public static PriorityScheduler Lowest = new PriorityScheduler(ThreadPriority.Lowest); 

    public static 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 
    } 
} 

我想停下來,這取決於有優先級,例如恢復任務如果具有較高優先級,新任務到達,下停止,讓任務執行,然後繼續自己...

+2

你能提供意見,以要「得到當前正在執行的任務」短代碼的例子嗎? –

+0

您期望如何停止正在運行的任務? – svick

+0

我的意思是取消一個正在運行的任務....然後用相同的憑證重新啓動它......如果有一種優雅的方式,請分享它嗎? – faizanjehangir

回答

2

如果你指的是BlockingCollection<T>,你不能(直接)。當您致電Take()(或通過GetConsumingEnumerable()獲取下一個項目)時,項目(任務?)實際上將從基礎連接中移除。

,如果你想這是可用的你會需要讓你的消費存儲和揭露「當前任務」。

注意,Parallel Extension Extras項目提供了極大的QueuedTaskScheduler可以在這裏實現自己的目標。它允許你創建優先級爲TaskScheduler的實例,併爲你處理所有的調度。

+0

其實我在優先級調度程序中使用集合。我在其中分配具有不同優先級的任務。我需要知道哪些任務在開始運行時以什麼優先級運行。我不知道如何使用take(),還有其他想法? – faizanjehangir

+0

@faizanjehangir您可以將自己的底層收藏品提供給'BlockingCollection '。如果你使用一個PriorityQueue下,它會自動處理優先級調度爲你(而無需瞭解什麼是已經在執行) –

+0

我做了一個編輯的帖子,我想停下來,這取決於有優先級,例如恢復任務如果具有較高優先級,新任務到達,下停止,讓任務執行,然後繼續自己... – faizanjehangir

相關問題