2011-07-04 160 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