c#多样化线程也一样

本文关键字:一样 多样化 线程 | 更新日期: 2023-09-27 17:54:44

我是一个c#程序员,我遇到了一些线程问题。

资产是实体,我需要并行运行每个资产,并运行一个方法"doSomethingOnAsset"

我有一个有100个线程的程序(即每个资产1个线程,我正在对它进行一些操作)。一般来说,每个线程在运行的每个间隔上都有相同的时间框架,并且每个线程都调用"doSomethingOnAsset"方法。

每个线程间隔运行10毫秒(即)。

我不想要这么多线程,所以我为每个资产创建一个队列,但是当调用中心方法"doSomethingOnAsset"时-线程不是在相同的时间帧间隔内运行。

。第一个线程运行间隔周期为300毫秒。第二个线程运行间隔周期为700毫秒。第三个线程运行间隔周期为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事件信号,当外部程序触发。

谢谢:)

c#多样化线程也一样

对于这种生产-消费者的情况,我通常定义一个阻塞集合,定义并创建一个消费者(或多个),然后开始向集合添加数据。每个消费者实例将尝试获取一个项目,如果有,则消费它。否则,它将等待一个条目。

您可以添加一个取消令牌来支持停止处理。

您可以通过添加更多消费者轻松扩展它。当然,什么数量是最有效的取决于机器和核心的数量,结合每个项目的处理长度。

消费者:

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());
    }
}