2012-04-09 39 views
1

基本上我有一個我想要處理的對象的靜態自定義隊列。從多個線程中,我需要啓動一個單獨的任務來處理排隊的對象,當所有項目出列時停止任務。異步啓動只有一個任務來處理靜態隊列,當它完成時停止

一些僞代碼:

static CustomQueue _customqueue; 
static Task _processQueuedItems; 

public static void EnqueueSomething(object something) { 
    _customqueue.Enqueue(something); 
    StartProcessingQueue(); 
} 

static void StartProcessingQueue() { 
    if(_processQueuedItems != null) { 
     _processQueuedItems = new Task(() => { 
     while(_customqueue.Any()) { 
      var stuffToDequeue = _customqueue.Dequeue(); 
      /* do stuff */ 
     } 
     }); 
    _processQueuedItems.Start(); 
    } 
    if(_processQueuedItems.Status != TaskStatus.Running) { 
     _processQueuedItems.Start(); 
    } 
} 

如果它的確與衆不同我的自定義隊列,直到他們達到一定的年齡,基本上保持項的隊列,然後讓他們離隊。每次接觸一件物品時,它的計時器會重新開始。我知道這件作品很好。

我正在努力的部分是並行性。 (顯然,我不知道我在這裏做什麼)。 我想要的是讓一個線程處理隊列直到完成,然後離開。如果另一個調用進來,它不會啓動一個新的線程,除非必須。

我希望能解釋我的問題沒關係。

回答

2

您可能要考慮在這裏使用BlockingCollection<T>。你可以讓你的自定義隊列實現IProducerConsumerCollection,在這種情況下BC可以直接使用它。

然後,您只需啓動一個長時間運行的任務即可撥打blockingCollection.GetConsumingEnumerable()並在foreach中處理這些項目。任務將在收集爲空時自動阻塞,並在新項目爲Enqueued時重新啓動。

+0

謝謝。我甚至不知道存在。出於好奇,你是怎麼知道那裏的?我想,我可能只需要閱讀更多「X.0中的新功能」文章。 – 2012-04-09 23:48:46

+1

@blesh System.Collections.Concurrent有許多值得研究的好東西......這是記錄http://msdn.microsoft.com/en-us/library/dd460718.aspx對於即將到來的,請參閱:http:/ /blogs.msdn.com/b/pfxteam/archive/2011/09/17/10212961.aspx – 2012-04-10 00:10:11

相關問題