如何在同一个IEnumerable上同时运行两个方法?

本文关键字:两个 方法 运行 同一个 IEnumerable | 更新日期: 2023-09-27 17:54:13

假设我有

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

,其中Method1Method2都调用a上的foreach

这里的问题是,当传递给Method2时,将重新创建a。是否有一种方法可以让这两个方法同时运行?

假设

  1. 对于每个i, a的第i项将独立于任何外部值。
  2. 除此之外,我不知道我的方法将如何使用,所以我假设a太大而无法转换为列表,并且太昂贵而无法获得两次。
  3. 我不能编辑Method1Method2的内部。

如何在同一个IEnumerable上同时运行两个方法?

正如评论中建议的那样,您可以使用线程和同步来实现这一点:

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作为生产者和消费者的切换点。