我有一个无状态服务,该服务使用Fabric client api来遍历集群中的所有应用程序和服务,并验证其运行状况。
一旦获得所有服务(约1000个),它将执行以下代码:
var tasksList = new List<Task>();
IEnumerbale<Application> applications = await GetClusterApplications();
foreach (var application in applications)
{
cancellationToken.ThrowIfCancellationRequested();
var servicesList = await GetApplicationServices(application);
var task = Task.Run(async () =>
{
foreach (var service in servicesList)
{
await _client.TestManager.ValidateServiceAsync(service, TimeSpan.FromSeconds(10), cancellationToken);
}
}, cancellationToken);
tasksList.Add(task);
}
Task.WaitAll(tasksList.ToArray());
此代码大约需要4分钟才能完成,在45秒后,我们将开始另一个迭代。 检查内存,每次代码运行时它都会不断增加。在比较上面的代码之前和之后,我比较了堆。
为什么有那么多CancellationTokenSource对象?什么是SparselyPopulatedArrays? 最大的问题是:谁拥有这些对象的引用,却不允许GC收集它们?
顺便说一句,上面的代码被包装在一个方法中,该方法在每个间隔时间被称为,