【发布时间】:2020-03-19 17:39:40
【问题描述】:
一个有趣的内存泄漏。有谁知道为什么?
foreach (int x in Enumerable.Range(0, 1_000_000)
.Select(async i => i))
{
}
GC.Collect();
Console.WriteLine(GC.GetTotalAllocatedBytes()); // 1036542160
foreach (int x in Enumerable.Range(0, 1_000_000)
.Select(async i => i))
{
}
GC.Collect();
Console.WriteLine(GC.GetTotalAllocatedBytes()); // 2072860704
foreach (int x in Enumerable.Range(0, 1_000_000)
.Select(async i => i))
{
}
GC.Collect();
Console.WriteLine(GC.GetTotalAllocatedBytes()); // 3109160008
地点:
static class SelectAsync
{
public static IEnumerable<TResult> Select<T, TResult>(
this IEnumerable<T> source, Func<T, Task<TResult>> selector) =>
source
.ToObservable()
.Select(value => Observable.FromAsync(() => selector(value)))
.Concat()
.ToEnumerable();
}
【问题讨论】:
-
您的示例表明,如果性能和资源的有效利用至关重要,那么反应式扩展可能不是该工作的正确工具。你可以用一个简单的循环和
List<TResult>来收集结果,只消耗一小部分 RAM 和 CPU 资源。
标签: c# linq system.reactive