有序执行线程

时间:2010-08-12 17:50:17

标签: c# .net multithreading locking

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

以下示例是我正在尝试的,问题是执行线程没有被命令。

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

1 个答案:

答案 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,但这一切都值得一读。