同步多个线程

时间:2011-07-04 08:44:14

标签: c# .net multithreading

我在.NET中有一个需要与库通信的多线程环境。该库有一些限制,因此无法在多线程环境中正常工作。我需要一种方法来解决这个问题,方法是创建多线程环境与之通信的中间层,然后调用库。我提出了解决问题的解决方案,但我不相信它是最好的解决方案。我创建了一个具有run方法的异步线程。 run方法是无限循环,它检查当前任务(我设置的参数)是什么,并执行相应的方法。

正如我所说,我完全不相信这个解决方案,但它能正确地完成工作。所以请告诉我是否有更好的解决方案(特别是如果它与C#有关)。

正如旁注所示,限制不是由于多个线程同时工作并导致数据损坏。我需要完全相同的线程来完成所有事情(取决于线程ID)。

1 个答案:

答案 0 :(得分: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