首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c#多样化均线

c#多样化均线
EN

Stack Overflow用户
提问于 2016-07-04 12:17:51
回答 1查看 70关注 0票数 0

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

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

我有一个程序,它有100个线程(也就是说,每个资产都有一个线程,我正在做一些操作)。通常,每个线程在运行的每个内部都有相同的时间框架,每个线程都调用"doSomethingOnAsset“方法。

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

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

也就是说,第一个线程运行间隔周期是300毫秒。第二个线程运行间隔周期为700毫秒。第三个线程运行间隔周期为2秒。..。

运行预定义方法100次并行的最佳方法是什么(并行条目可能是外部服务,在运行时触发运行我的代码"doSomethingOnAsset“的事件。

代码语言:javascript
复制
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。

谢谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-04 13:14:06

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

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

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

消费者:

代码语言:javascript
复制
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);
        }
    }
}

用法:

代码语言:javascript
复制
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());
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38184596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档