2011-07-04 196 views
2

我有一個需要與庫通信的.NET多線程環境。該庫有一些限制,因此無法在多線程環境中正常工作。我需要一種方法來解決這個問題,使多線程環境與中間層進行通信,然後調用庫。我提出瞭解決問題的解決方案,但我不相信這是最好的解決方案。我創建了一個具有運行方法的異步線程。 run方法處於無限循環中,它檢查當前任務(我設置的參數)是什麼,並執行相應的方法。同步多個線程

正如我所說,我對這個解決方案根本不信服,但它正確地完成了這項工作。所以請告訴我是否有更好的解決方案(尤其是與C#相關的)。

正如旁註所示,限制不是由於多個線程同時工作並導致數據損壞。我需要完全相同的線程來執行所有操作(取決於線程ID)。

+3

你的方法聽起來不錯。帶有無限循環的線程在沒有待處理任務時應該睡眠。你的實現是否這樣做?如果沒有,發佈一些代碼,以便我們可以幫助你。 – dtb

+2

您可能需要使用[BlockingCollection ](http://msdn.microsoft.com/en-us/library/dd267312.aspx)包裝一[ConcurrentQueue ](http://msdn.microsoft.com /en-us/library/dd267265.aspx)。 – dtb

+0

您也可以實現一個自定義的[TaskScheduler](http://msdn.microsoft.com/zh-cn/library/system.threading.tasks.taskscheduler.aspx),它可以調度同一線程上的所有任務。 – dtb

回答

2

看看Task Parallel Library

我建議你實現一個自定義TaskScheduler它調度同一線程上的所有任務。您可以使用調度程序安排Task(無結果值)或Task<T>(類型T的結果)。

您可以使用BlockingCollection<Task>包裝一ConcurrentQueue<Task>實施調度。

例如,假設你的庫公開函數MakeCoffee,你可以創建一個類CoffeeMachine提供匹配的包裝方法和時間表呼籲定製調度庫的任務:

public class CoffeeMachine 
{ 
    private readonly TaskScheduler scheduler; 

    public CoffeeMachine() 
    { 
     this.scheduler = new SingleThreadTaskScheduler(); 
    } 

    public Task<Coffee> MakeCoffeeAsync() 
    { 
     return Task.Factory.StartNew<Coffee>(
      this.MakeCoffee, 
      CancellationToken.None, 
      TaskCreationOptions.None, 
      this.scheduler); 
    } 

    private Coffee MakeCoffee() 
    { 
     // this method will always execute on the same thread 
    } 
} 

用法:

CoffeeMachine machine = new CoffeeMachine(); 

Task<Coffee> task = machine.MakeCoffeeAsync(); // start task 

task.Wait();          // wait for task to complete 
Drink(task.Result);        // use result 
+0

非常感謝@dtb – Sami