programing

작업을 취소하려면 어떻게 해야 합니까?언제 다?

telecom 2023. 5. 15. 21:16
반응형

작업을 취소하려면 어떻게 해야 합니까?언제 다?

현재 다음 코드를 사용하여 작업 모음이 완료될 때까지 기다립니다.그러나 지금은 취소 토큰을 통해 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

반응형