0
我有以下测试代码来模拟信号量和限制任务执行的使用。如果其中一个正在运行的任务抛出像下面这样的异常,是否有办法不继续创建新任务?我不需要现有的任务来停止运行,我只是希望遇到异常后不会有新的任务启动。如果在当前正在运行的任务中发生异常,停止执行半任务任务
当前任务将在下面的这种情况下开始。我想让它在因抛出异常而运行几个任务之后停止。
var testStrings = new List<string>();
for (var i = 0; i < 5000; i++)
{
testStrings.Add($"string-{i}");
}
using (var semaphore = new SemaphoreSlim(10))
{
var tasks = testStrings.Select(async testString =>
{
await semaphore.WaitAsync();
try
{
Console.WriteLine($"{testString}-Start");
await Task.Delay(2000);
throw new Exception("test");
}
finally
{
semaphore.Release();
}
});
await Task.WhenAll(tasks);
}
天真的方法是设置错误标志并从任何任务返回(即使在执行过程中,如果你想)如果标志设置。这有开销仍然不得不开始所有的任务。 – Sinatr
[如何取消并在Task.WhenAll上引发异常(如果发生任何异常?)可能的重复?](https://stackoverflow.com/questions/41899842/how-to-cancel-and-raise-an-exception-如果任何异常被提出) – Sinatr
我想如果我添加一个catch块给我的尝试,并说如果(!cancellationTokenSource.IsCancellationRequested) cancellationTokenSource.Cancel();然后将每个包装在可能有效的if(!cancellationToken.IsCancellationRequested)中 – mameesh