2010-08-12 97 views
1

我有一个控制台应用程序,它与另一个用户界面进行交互。接口发送命令,我的应用程序应该处理它们。在处理和执行命令时,一直听我的控制台应用程序很重要。所以我在主线程上监听接口并在另一个线程中执行命令。已排序执行线程

下面的例子是我正在尝试和问题是执行线程没有排序。

第二件事是我在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 
     } 
    } 
} 

回答

4

您正在为每一行输入开始一个新线程。这就是为什么你不能保证订购。

取而代之的是,创建一个“阅​​读器”可以放入行,“处理器”可以读取的队列。有一个线程读取和一个线程处理。我在生产者/消费者队列的线程教程中有some sample code,尽管它非常简单。

如果你使用.NET 4.0(我猜你是给出了使用的dynamic),然后并行扩展使得这容易使用BlockingCollection<T>IProducerConsumerCollection<T>。今天是你的幸运日 - Joe Albahari已在他的网站上公开发表Parallel Extensions part of C# 4 in a Nutshell。通读一下,它应该使一切更清晰。你可能想跳到BlockingCollection<T> part,但这都值得一读。

+1

我的锁实现呢?当另一个线程输入方法时,传入的命令可以在锁中更改 – Freshblood 2010-08-12 18:46:06

+0

@Freshblood:不,它不会改变每个线程正在处理的内容......它只是强制你的线程被序列化 - 每次只有一个线程被激活,使得它首先有多个线程毫无意义。 – 2010-08-12 18:59:06

+0

我喜欢那个网站。多年来我一直在使用它作为参考。 – 2010-08-12 23:02:30