我在.NET中有一个需要与库通信的多线程环境。该库有一些限制,因此无法在多线程环境中正常工作。我需要一种方法来解决这个问题,方法是创建多线程环境与之通信的中间层,然后调用库。我提出了解决问题的解决方案,但我不相信它是最好的解决方案。我创建了一个具有run方法的异步线程。 run方法是无限循环,它检查当前任务(我设置的参数)是什么,并执行相应的方法。
正如我所说,我完全不相信这个解决方案,但它能正确地完成工作。所以请告诉我是否有更好的解决方案(特别是如果它与C#有关)。
正如旁注所示,限制不是由于多个线程同时工作并导致数据损坏。我需要完全相同的线程来完成所有事情(取决于线程ID)。
答案 0 :(得分:2)
我建议您实现一个自定义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