.NET에서 제공자 모델 패턴을 사용하는 작은 응용 프로그램을 작성하고 있습니다. 각 프로 바이더에는, 어플리케이션으로 플러그 인하기 위해서 구현하는 1 개의 메소드가 있습니다.C# async, 코드에 액세스하지 않고 작업이 완료되면 모든 작업을 중지하십시오.
모든 공급자의 특정 작업 (구현 된 메서드)을 다른 스레드에서 실행하려고하지만 하나의 작업이 완료되면 다른 모든 작업이 실행을 중지해야합니다.
.NET에서 async/await 모델을 사용하여 CancellationToken을 사용하여 작업을 취소합니다.
tasks.Add(Task.Run(() =>
{
if (token.IsCancellationRequested)
token.ThrowIfCancellationRequested();
return provider.DoWork();
}, token));
while (tasks.Count > 0)
{
var t = await Task.WhenAny(tasks);
tasks.Remove(t);
var result = await t;
if (!string.IsNullOrEmpty(result))
{
tokenSource.Cancel();
return result;
}
}
provider.DoWork의 일부
() 메소드는 매우 느릴 수 있습니다 및 DoWork 방법은 내가 DoWork 방법 내에서 token.IsCancellationRequested을 확인해야 실행되는 스레드를 중지하지만이 방법은 기록 할 수 없기 때문에 예를 들어, 다른 누군가로부터. 토큰 검사. DoWork 외부로의 요청 취소는 그럴 경우 중요하지 않습니다.요약하면 하나의 작업이 끝나면 다른 작업을 중지해야하지만 각 스레드에서 실행중인 코드에 액세스 할 필요가 없습니다.
당신의 생각을 듣고 싶습니다.
"가장 빠른 공급자가 이긴다"는 이상한 모델입니다. –
제공자가 협조적이며 주기적으로 취소 토큰을 확인할 수 없다면 작성해야 할 것으로 의심됩니다. 코드는 공급자의 스레드를 관리하고 중지하려는 공급자의 스레드를 중단/중단합니다. –
@MarcGravell 공급자가 뭔가를 검색하는 html 파서 (html 파서) 중 하나가 사이트를 찾았을 때 다른 사이트에서 5 ~ 10 초 동안 응답을 기다리는 경우 왜 10 초를 기다려야하는지 생각해보십시오. 사실 그 코드를 사용하면 (클라이언트로서) 검색 결과가 표시되지만 작업이 종료되지 않으며 CPU가 100 % 불필요합니다. –