如何在同一时间对一个IEnumerable运行两个方法

时间:2016-07-03 20:51:50

标签: c# concurrency ienumerable

假设我有

void MethodBoth(IEnumerable<int> a){
  Method1(a);
  Method2(a);
}

Method1Method2同时在foreach上拨打a

此处的问题是,a会在传递给Method2时重新创建。有没有办法让两种方法同时运行?

假设

  1. 对于每个i,a的第i个条目将独立于任何外部值。
  2. 除此之外,我不知道我的方法将如何使用,因此我假设a太大而无法转换为列表而且太贵而无法获得两次。
  3. 我无法修改Method1Method2
  4. 的内部

1 个答案:

答案 0 :(得分:4)

根据评论中的建议,您可以使用线程和同步来实现此目的:

var consumer1 = new BlockingCollection<int>(boundedCapacity: 1);
var consumer2 = new BlockingCollection<int>(boundedCapacity: 1);
var task1 = Task.Run(() => Method1(consumer1.GetConsumingEnumerable()));
var task2 = Task.Run(() => Method2(consumer2.GetConsumingEnumerable()));

foreach (var item in sourceCollection) {
 consumer1.Add(item);
 consumer2.Add(item);
}

consumer1.CompleteAdding();
consumer2.CompleteAdding();

Task.WaitAll(task1, task2);

我正在使用BlockingCollection作为生产者消费者切换点。