반응형
작업을 취소하려면 어떻게 해야 합니까?언제 다?
현재 다음 코드를 사용하여 작업 모음이 완료될 때까지 기다립니다.그러나 지금은 취소 토큰을 통해 WhenAll 통화를 취소/중지할 수 있는 상황이 되었습니다.제가 어떻게 해야 할까요?
Dim TaskCollection As New List(Of Tasks.Task)
For x As Integer = 1 To Threads
Dim NewTask As Tasks.Task = TaskHandler.Delegates(DelegateKey).Invoke(Me, Proxies, TotalParams).ContinueWith(Sub() ThreadFinished())
TaskCollection.Add(NewTask)
Next
Await Tasks.Task.WhenAll(TaskCollection)
저는 그것이 다음 코드와 같은 것일 것이라고 생각하지만, 'XXX'에 무엇이 들어갈지 확신할 수 없습니다.
Await Tasks.Task.WhenAny(Tasks.Task.WhenAll(TaskCollection), XXX)
사용하다TaskCompletionSource<T>
비동기 API가 없는 일부 비동기 조건에 대한 작업을 만듭니다.사용하다CancellationToken.Register
현대판 취소를 걸다토큰 기반 취소 시스템을 다른 취소 시스템으로 전환합니다.솔루션은 이 두 가지를 결합하기만 하면 됩니다.
내 AsyncEx 라이브러리에 확장 방법이 있지만 다음과 같이 직접 작성할 수 있습니다.
<System.Runtime.CompilerServices.Extension> _
Public Shared Function AsTask(cancellationToken As CancellationToken) As Task
Dim tcs = New TaskCompletionSource(Of Object)()
cancellationToken.Register(Function() tcs.TrySetCanceled(), useSynchronizationContext := False)
Return tcs.Task
End Function
사용량은 예상대로입니다.
Await Task.WhenAny(Task.WhenAll(taskCollection), cancellationToken.AsTask())
Dim tcs as new TaskCompletionSource(Of Object)()
Await Tasks.Task.WhenAny(Tasks.Task.WhenAll(TaskCollection), tcs)
취소하려면 TCS에 문의하십시오.결과 설정(없음).작업이 시작됩니다.언제든지.
제 의견으로는 더 우아합니다.
await Task.Run(()=> Task.WaitAll(myArrayOfTasks), theCancellationToken);
언급URL : https://stackoverflow.com/questions/27238232/how-can-i-cancel-task-whenall
반응형
'programing' 카테고리의 다른 글
일부 컨텍스트를 전달하는 동안 expressjs에서 리디렉션하려면 어떻게 해야 합니까? (0) | 2023.05.15 |
---|---|
마지막으로 삽입한 ID에 대한 PostgreSQL 함수 (0) | 2023.05.15 |
피클 파일에 여러 개체를 저장하고 로드하시겠습니까? (0) | 2023.05.15 |
a인지 확인하려면 어떻게 해야 합니까?NET 어셈블리는 x86 또는 x64용으로 제작되었습니까? (0) | 2023.05.15 |
Xcode 7이 *.dylib이 아닌 *.tbd로 표시되는 이유는 무엇입니까? (0) | 2023.05.15 |