我是一名C#程序员,遇到了一些线程问题。
资产是实体,我需要并行运行每个资产,并运行方法“doSomethingOnAsset”
我有一个程序有100个线程(即每个资产1个线程,我正在做一些操作)。通常,每个线程在每个运行的intrval上都有相同的时间帧,每个线程都调用“doSomethingOnAsset”方法。
每个线程间隔运行10毫秒(即)。
我不需要这么多线程,所以我为每个资产创建了一个队列,但是当调用中心方法“doSomethingOnAsset”时 - 线程没有在相同的时间帧间隔内运行。
即第一个线程运行间隔周期为300毫秒。 第二个线程运行间隔周期为700毫秒。 第3个线程运行间隔周期为2秒。 ...
运行预定义方法100次并行的最佳方法是什么(并行条目可能是运行时的外部服务,触发运行我的代码“doSomethingOnAsset”的事件。
public void doSomethingOnAsset(object obj)
{
// infinite loop when thread.
while (true)
{
doSomething(obj);
Thread.Sleep(100);
}
}
public void doSomething(object obj)
{
// do something.
}
public void Run()
{
Thread t;
for (int i = 0; i < 100; i++)
{
t = new Thread(new ParameterizedThreadStart(this.doSomethingOnAsset));
t.Start(new object());
}
Console.ReadLine();
}
当外部程序触发时,或在事件信号上调用doSomething。
谢谢:)
答案 0 :(得分:1)
对于这些类型的生产 - 消费者情况,我通常定义一个阻塞集合,定义和创建一个消费者(或多个),并开始向集合中添加数据。每个消费者实例都会尝试获取一个项目,如果有的话,会消耗它。否则,它将等待一个项目。
您可以添加取消令牌以支持停止处理。
您可以通过添加更多消费者来轻松扩展它。当然,最有效的数字取决于机器和核心数量,以及每件物品的处理长度。
消费者:
public class MyConsumer<T> {
public MyConsumer(BlockingCollection<T> collection, Action<T> action) {
_collection = collection;
_action = action;
}
private readonly BlockingCollection<T> _collection;
private readonly Action<T> _action;
public void StartConsuming() {
new Task(Consume).Start();
}
private void Consume() {
while (true) {
var obj = _collection.Take();
_action(obj);
}
}
}
用法:
public void doSomething(object obj) {
// do something.
}
public void Run() {
var collection = new BlockingCollection<object>();
// Start workers
for (int i = 0; i < 5; i++) {
new MyConsumer<object>(collection, doSomethingOnAsset);
}
// Create object to consume
for (int i = 0; i < 100; i++) {
collection.Add(new object());
}
}