如何在同一个IEnumerable上同时运行两个方法?
本文关键字:两个 方法 运行 同一个 IEnumerable | 更新日期: 2023-09-27 17:54:13
假设我有
void MethodBoth(IEnumerable<int> a){
Method1(a);
Method2(a);
}
,其中Method1
和Method2
都调用a
上的foreach
。
这里的问题是,当传递给Method2
时,将重新创建a
。是否有一种方法可以让这两个方法同时运行?
假设
- 对于每个i,
a
的第i项将独立于任何外部值。 - 除此之外,我不知道我的方法将如何使用,所以我假设
a
太大而无法转换为列表,并且太昂贵而无法获得两次。 - 我不能编辑
Method1
或Method2
的内部。
正如评论中建议的那样,您可以使用线程和同步来实现这一点:
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
作为生产者和消费者的切换点。