gpt4 book ai didi

c# - 有序执行线程

转载 作者:太空宇宙 更新时间:2023-11-03 22:20:02 27 4
gpt4 key购买 nike

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

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

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

最佳答案

您正在为每一行输入启动一个新线程。这就是您不能保证顺序的原因。

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

如果您使用的是 .NET 4(我猜您应该使用 dynamic ),那么使用 BlockingCollection<T> 可以通过并行扩展很多 IProducerConsumerCollection<T> .今天是你的幸运日 - Joe Albahari 取得了 Parallel Extensions part of C# 4 in a Nutshell在他的网站上公开。仔细阅读它,它应该使一切都更加清晰。您可能想跳到 BlockingCollection<T> part ,但这一切都值得一读。

关于c# - 有序执行线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3470528/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com