【发布时间】:2017-10-13 20:55:40
【问题描述】:
我有以下测试代码来模拟信号量的使用和限制任务的执行。如果其中一个正在运行的任务引发如下异常,有没有办法不继续创建新任务。我不需要现有任务停止运行,我只希望遇到异常后不再启动新任务。
目前任务都将在下面的这个场景中开始。由于抛出异常,我希望它在运行一些任务后停止。
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);
}
【问题讨论】:
-
天真的方法是在错误时设置标志,如果标志被设置,则从任何任务(即使在执行期间)返回。这仍然需要启动所有任务的开销。
-
我想如果我在尝试中添加一个 catch 块并说 if (!cancellationTokenSource.IsCancellationRequested)cancellationTokenSource.Cancel();然后将每个都包装在一个可能有效的 if (!cancellationToken.IsCancellationRequested) 中