gpt4 book ai didi

c# - Task.WaitAll 正在阻塞

转载 作者:行者123 更新时间:2023-11-30 20:30:05 31 4
gpt4 key购买 nike

我想同时运行两个任务,其中一个任务中有一个 Task.Delay()。

即一个连续运行,一个每 15 分钟运行一次。

这是我目前所拥有的:

public class ContinousAndAggregatedCheckRunner<T, T2>                                                             
{
private readonly int _aggregationInterval;
private readonly List<T> _collectedData;
private readonly Func<IEnumerable<T>, Task<T2>> _aggregator;
private readonly Func<Task<IEnumerable<T>>> _collector;
private CancellationToken _aggregationToken = default(CancellationToken);
private CancellationToken _collectionToken = default(CancellationToken);

public ContinousAndAggregatedCheckRunner(Func<IEnumerable<T>, Task<T2>> aggregator,
int aggregationInterval,
Func<Task<IEnumerable<T>>>)
{
_aggregator = aggregator;
_aggregationInterval = aggregationInterval;
_collector = collector;
_collectedData = new List<T>();
}

public async Task Run()
{
Task.WaitAll(Collect(), Aggregate());
}

private async Task Collect()
{
while (!_collectionToken.IsCancellationRequested)
{
Console.WriteLine($"Collecting {DateTime.Now.ToLongDateString()} {DateTime.Now.ToLongTimeString()}");
try
{
var results = await _collector();
_collectedData.AddRange(results);
}
catch (TaskCanceledException)
{
break;
}
}
}

private async Task Aggregate()
{
while (!_aggregationToken.IsCancellationRequested)
{
Console.WriteLine("Aggregating");
try
{
var aggregate = await _aggregator(_collectedData);
var taskFactory = new TaskFactory();
await taskFactory.StartNew(() => Send(aggregate), _aggregationToken);
_collectedData.Clear();
await Task.Delay(TimeSpan.FromMinutes(_aggregationInterval), _aggregationToken);
}
catch (TaskCanceledException)
{
break;
}
}
}

问题是,它运行了一段时间的收集。然后它进入 Aggregate() 并停止为 Task.Delay() 做任何事情然后它 Sends()。然后它又什么都不做。

什么都不做,我的意思是 Collect() 停止执行。

我假设它在某些时候是阻塞的。

我缺少的是他们的模式吗?我想无限期地运行两个任务,并允许其中一个任务暂停一段指定的时间而不影响另一个任务。

最佳答案

有几件事可以解决。

  1. 正如 Ben Voigt 所说,“WaitAll”确实是一个障碍,您最好使用 WhenAll 来执行一系列任务
  2. 值得使用 Task.Factory.StartNew 而不是实例化新的 TaskFactory 实例
  3. StartNew 可能根本不是最佳选择,请在此处查看详细信息 https://blog.stephencleary.com/2013/08/startnew-is-dangerous.html

关于c# - Task.WaitAll 正在阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45284327/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com