gpt4 book ai didi

c# - 管理多线程流程

转载 作者:行者123 更新时间:2023-12-03 13:17:50 25 4
gpt4 key购买 nike

我收到一项作业,觉得非常具有挑战性,不知道如何开始。

这是问题:

我有一个随机的产品队列(由A,B和C类型组成),

P [A],P [A],P [B],P [C],P [C],P [A],P [B],P [B]...。

我要同时将这些产品发送到ProcessProduct(),但是不能一起处理两种相同类型的产品。

这是场景:

第一个P [A]得到处理,第二个P [A]将不得不等待第一个P [A],第三个P [B]和第四个P [C]将立即得到处理,而第五个P [C]将不得不等待上一个....

希望我的描述不要太困惑。
如果有人可以给我一些建议,我将不胜感激。
谢谢你。

最佳答案

按类型对产品列表进行分组,然后并行处理每个组。

编辑过

这是一个示例(如果产品列表是静态的):

sealed class Product
{
public string Type
{
get;
set;
}
}

sealed class ProductProcessor
{
public void StartProcessing(IEnumerable<Product> products)
{
foreach (var group in products.GroupBy(x => x.Type))
Task.Factory.StartNew(() => ProcessProducts(group));
}

private void ProcessProducts(IEnumerable<Product> products)
{
foreach (Product product in products)
ProcessProduct(product);
}

private void ProcessProduct(Product product)
{

}
}

这是动态处理产品队列的另一个示例(我没有运行代码,而是将其作为一种伪代码读取):
sealed class ProductProcessor
{
public void Process(Product product)
{
lock (_queues)
{
if (_queues.ContainsKey(product.Type))
_queues[product.Type].Enqueue(product);
else
{
ConcurrentQueue<Product> queue = new ConcurrentQueue<Product>();
queue.Enqueue(product);

_queues.Add(product.Type, queue);

WaitCallback action = delegate(object state)
{
Product productToProcess;
while (queue.TryDequeue(out productToProcess))
{
ProcessProduct(productToProcess);
}

lock (_queues) _queues.Remove(product.Type);
};

ThreadPool.QueueUserWorkItem(action);
}
}
}

private Dictionary<string, ConcurrentQueue<Product>> _queues
= new Dictionary<string, ConcurrentQueue<Product>>();

private void ProcessProduct(Product product)
{

}
}

P.S.可以使用ConcurrentDictionary代替锁。

关于c# - 管理多线程流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9767490/

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