C# 有序执行线程
我有一个与另一个用户界面交互的控制台应用程序。接口发送命令,我的应用程序应该能够处理这些命令。在有序地处理和执行命令时,保持监听我的控制台应用程序是很重要的。所以我在主线程上监听接口并在另一个线程中执行命令 下面的例子是我正在尝试的,问题是执行线程并没有排序 第二件事是我正在使用进程命令锁定方法,但我不确定它是否安全。例如,一个或多个线程可以位于ProcessCommand方法内部,因此一个进程处于锁定状态,以便另一个线程可以更改传入的输入值。我说得对吗?我做了一些测试,但从未发生过,但仍然对此表示怀疑 什么是最好的解决方案?解决方案可以是线程化,也可以不线程化C# 有序执行线程,c#,.net,multithreading,locking,C#,.net,Multithreading,Locking,我有一个与另一个用户界面交互的控制台应用程序。接口发送命令,我的应用程序应该能够处理这些命令。在有序地处理和执行命令时,保持监听我的控制台应用程序是很重要的。所以我在主线程上监听接口并在另一个线程中执行命令 下面的例子是我正在尝试的,问题是执行线程并没有排序 第二件事是我正在使用进程命令锁定方法,但我不确定它是否安全。例如,一个或多个线程可以位于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:不,它不会更改每个线程正在处理的内容。。。这只是强迫你的线程被序列化——一次只有一个线程处于活动状态,这使得在一开始就有多个线程是毫无意义的。我喜欢那个网站。多年来,我一直在使用它作为参考。我在您的样本中使用了监控方法,效果非常好。非常感谢。使用并行扩展可能很容易,但我只是个外国人。那个网站是关于多线程的很好的资源,但是用低级英语阅读它并不能带来足够的不幸。