我有一个与另一个用户界面交互的控制台应用程序。接口发送命令,我的应用程序应该处理它们。在按顺序处理和执行命令时继续监听我的控制台应用程序非常重要。所以我在主线程上监听接口并在另一个线程中执行命令。
以下示例是我正在尝试的,问题是执行线程没有被命令。
第二件事是我在ProcessCommand方法中使用锁,但我不确定它是否安全。例如,还有一个线程可以在ProcessCommand方法中,因此一个进程处于锁定状态,因此其他线程可以更改传入的输入值。我对吗 ?我做了一些测试,但从未发生过,但仍对此持怀疑态度。
什么是最佳解决方案?解决方案可以是线程化也可以不是线程化。
class Program
{
static object locker = new object();
static void Main(string[] args)
{
while (true)
{
var input = Console.ReadLine();
(new Thread(new ParameterizedThreadStart(ProcessCommand))).Start(input);
}
Console.ReadKey();
}
static void ProcessCommand(dynamic input)
{
lock (locker)
{
Console.WriteLine(input);
//process incoming command
}
}
}
答案 0 :(得分:4)
您正在为每行输入启动一个新线程。这就是为什么你不能保证订购。
而不是那样,创建一个“读者”可以放入行的队列,“处理器”可以读取。有一个线程读取和一个线程处理。我在生产者/消费者队列的线程教程中有some sample code,尽管它非常简单。
如果您使用的是.NET 4(我猜您使用的是dynamic
),那么使用BlockingCollection<T>
和{{IProducerConsumerCollection<T>
进行并行扩展会使 更容易 3}}。今天是你的幸运日 - Joe Albahari在他的网站上公开了Parallel Extensions part of C# 4 in a Nutshell。仔细阅读,它应该使一切更清晰。您可能想要跳到BlockingCollection<T>
part,但这一切都值得一读。