Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有序执行线程_C#_.net_Multithreading_Locking - Fatal编程技术网

C# 有序执行线程

C# 有序执行线程,c#,.net,multithreading,locking,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
        }
    }
}

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

相反,创建一个队列,“读取器”可以将行放入其中,“处理器”可以从中读取。有一个线程读取和一个线程处理。我在我的线程教程中有一个生产者/消费者队列,尽管它非常简单


如果您使用的是.NET4(我想您会使用
dynamic
),那么并行扩展将使其更易于使用和维护。今天是你的幸运日——乔·阿尔巴哈里已经在他的网站上公开了。通读一遍,它会让一切变得更清楚。您可能想跳到,但这些都值得一读。

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

相反,创建一个队列,“读取器”可以将行放入其中,“处理器”可以从中读取。有一个线程读取和一个线程处理。我在我的线程教程中有一个生产者/消费者队列,尽管它非常简单


如果您使用的是.NET4(我想您会使用
dynamic
),那么并行扩展将使其更易于使用和维护。今天是你的幸运日——乔·阿尔巴哈里已经在他的网站上公开了。通读一遍,它会让一切变得更清楚。您可能想跳到,但这些都值得一读。

我的锁实现如何?当另一个线程进入方法时,传入的命令可以在锁中更改?@Freshblood:不,它不会更改每个线程正在处理的内容。。。这只是强迫你的线程被序列化——一次只有一个线程处于活动状态,这使得在一开始就有多个线程是毫无意义的。我喜欢那个网站。多年来,我一直在使用它作为参考。我在您的样本中使用了监控方法,效果非常好。非常感谢。使用并行扩展可能很容易,但我只是个外国人。那个网站是关于多线程的很好的资源,但是用低级英语阅读它并不能带来足够的不幸。我的锁实现呢?当另一个线程进入方法时,传入的命令可以在锁中更改?@Freshblood:不,它不会更改每个线程正在处理的内容。。。这只是强迫你的线程被序列化——一次只有一个线程处于活动状态,这使得在一开始就有多个线程是毫无意义的。我喜欢那个网站。多年来,我一直在使用它作为参考。我在您的样本中使用了监控方法,效果非常好。非常感谢。使用并行扩展可能很容易,但我只是个外国人。那个网站是关于多线程的很好的资源,但是用低级英语阅读它并不能带来足够的不幸。