취소 또는 시간 초과가 발생할 때 모든 작업이 완료 될 때까지 기다리거나 예외를 발생시키는 아래 함수를 만들었습니다.
public static async Task WhenAll(
IEnumerable<Task> tasks,
CancellationToken cancellationToken,
int millisecondsTimeOut)
{
Task timeoutTask = Task.Delay(millisecondsTimeOut, cancellationToken);
Task completedTask = await Task.WhenAny(
Task.WhenAll(tasks),
timeoutTask
);
if (completedTask == timeoutTask)
{
throw new TimeoutException();
}
}
tasks
긴 시간 초과 (예 : millisecondsTimeOut
= 60,000) 전에 모든 작업이 완료 timeoutTask
되면 함수가 반환 된 후에도 60 초가 경과 할 때까지 계속 유지됩니까? 그렇다면 폭주 문제를 해결하는 가장 좋은 방법은 무엇입니까?
예, timeoutTask
해당 시간 제한이 끝날 때까지 (또는 CancellationToken
이 취소 될 때까지 ) 계속됩니다.
CancellationToken
새로 만든 것과 다른 것을 전달 하고 마지막에 취소 CancellationTokenSource
하면 문제를 해결할 수 있습니다 CancellationTokenSource.CreateLinkedTokenSource
. 또한 완료된 작업을 기다려야합니다. 그렇지 않으면 실제로 예외 (또는 취소)를 관찰하지 않습니다.
public static async Task WhenAll(
IEnumerable<Task> tasks,
CancellationToken cancellationToken,
int millisecondsTimeOut)
{
var cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
var timeoutTask = Task.Delay(millisecondsTimeOut, cancellationTokenSource.Token);
var completedTask = await Task.WhenAny(Task.WhenAll(tasks), timeoutTask);
if (completedTask == timeoutTask)
{
throw new TimeoutException();
}
cancellationTokenSource.Cancel();
await completedTask;
}
그러나, 나는 당신이 구별 할 필요가없는 경우, 당신이 원하는 것을 달성 할 수있는 간단한 방법이 있다고 생각 TimeoutException
하고 TaskCancelledException
. CancellationToken
이 취소되거나 시간 초과가 끝날 때 취소되는 연속을 추가하기 만하면 됩니다.
public static Task WhenAll(
IEnumerable<Task> tasks,
CancellationToken cancellationToken,
int millisecondsTimeOut)
{
var cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
cancellationTokenSource.CancelAfter(millisecondsTimeOut);
return Task.WhenAll(tasks).ContinueWith(
_ => _.GetAwaiter().GetResult(),
cancellationTokenSource.Token,
TaskContinuationOptions.ExecuteSynchronously,
TaskScheduler.Default);
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다