도주를 방지하기 위해 작업을 종료하는 가장 좋은 방법은 무엇입니까?

토니

취소 또는 시간 초과가 발생할 때 모든 작업이 완료 될 때까지 기다리거나 예외를 발생시키는 아래 함수를 만들었습니다.

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 초가 경과 할 때까지 계속 유지됩니까? 그렇다면 폭주 문제를 해결하는 가장 좋은 방법은 무엇입니까?

i3arnon

예, 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

여러 비동기 작업을 처리하고 추가 처리를 위해 각각을 처리하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

VS2013 Ultimate에서 개발 한 AngularJS 앱을 테스트하기 위해 각도기를 실행하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

유사성을 찾기 위해 이미지 크기를 조정하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

기사 / 댓글 / 게시물 등의 작성자를 위해 HTML 페이지를 구문 분석하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

외래 키 관계를 업데이트하기 위해 참조 테이블에서 값을 가져 오는 가장 좋은 방법은 무엇입니까?

분류에서Dev

첫 글자와 마지막 글자를 일치시키기 위해 문자열 목록을 분할하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

천 단위 구분 기호를 피하기 위해이 SQL 조각을 다시 형식화하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

단위 테스트에서 UIImage에 대해 주장하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

새 작업을 추가하기 위해 .desktop 파일을 확장하는 방법은 무엇입니까?

분류에서Dev

해시를 병합하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

작업을 다시 시작하기 위해 비행 중 스레드를 종료하는 적절한 방법은 무엇입니까?

분류에서Dev

GNU가 모든 CLI 명령을 준수하기 위해 "--json"매개 변수를 추가하도록 주장하는 방법은 무엇입니까?

분류에서Dev

종료 후크를 만드는 가장 좋은 방법은 무엇입니까?

분류에서Dev

종료 후크를 만드는 가장 좋은 방법은 무엇입니까?

분류에서Dev

종료 후크를 만드는 가장 좋은 방법은 무엇입니까?

분류에서Dev

XBMC 용 DVD를 백업하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

봄에 부모 클래스 필드를 autowire하기 위해 가장 좋은 방법은 무엇입니까?

분류에서Dev

removeSuffix ()를 작성하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

목록을 반복하고 Java에서 종료하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

PowerShell : Write-Debug를 통해 변수 내용을 표시하는 '가장 좋은'방법은 무엇입니까?

분류에서Dev

메시지를 연기하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

Java8 기능을 통해 결과를 얻을 수있는 가장 좋은 방법은 무엇입니까?

분류에서Dev

DirectShow에서 PAR (픽셀 종횡비) 문제를 해결하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

기본 50/50 분할 대신 하위 하위보기가 공간의 2/3를 차지하도록하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

Angular2 : 지시문과 서비스를 모두 포함하는 기능을 모듈로 분해하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

Powershell IDE : Powershell ISE를 종료하지 않고 모든 변수를 지우기 위해 대화 형 셸을 다시 시작하는 방법은 무엇입니까?

분류에서Dev

pytest에서 테스트를 위해 여러 부울 조합을 지원하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

새해로가는 주 번호를 쿼리하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

Ruby 단위 테스트를 위해 StringIO 입력을 모의하는 가장 좋은 방법은 무엇입니까?

Related 관련 기사

  1. 1

    여러 비동기 작업을 처리하고 추가 처리를 위해 각각을 처리하는 가장 좋은 방법은 무엇입니까?

  2. 2

    VS2013 Ultimate에서 개발 한 AngularJS 앱을 테스트하기 위해 각도기를 실행하는 가장 좋은 방법은 무엇입니까?

  3. 3

    유사성을 찾기 위해 이미지 크기를 조정하는 가장 좋은 방법은 무엇입니까?

  4. 4

    기사 / 댓글 / 게시물 등의 작성자를 위해 HTML 페이지를 구문 분석하는 가장 좋은 방법은 무엇입니까?

  5. 5

    외래 키 관계를 업데이트하기 위해 참조 테이블에서 값을 가져 오는 가장 좋은 방법은 무엇입니까?

  6. 6

    첫 글자와 마지막 글자를 일치시키기 위해 문자열 목록을 분할하는 가장 좋은 방법은 무엇입니까?

  7. 7

    천 단위 구분 기호를 피하기 위해이 SQL 조각을 다시 형식화하는 가장 좋은 방법은 무엇입니까?

  8. 8

    단위 테스트에서 UIImage에 대해 주장하는 가장 좋은 방법은 무엇입니까?

  9. 9

    새 작업을 추가하기 위해 .desktop 파일을 확장하는 방법은 무엇입니까?

  10. 10

    해시를 병합하는 가장 좋은 방법은 무엇입니까?

  11. 11

    작업을 다시 시작하기 위해 비행 중 스레드를 종료하는 적절한 방법은 무엇입니까?

  12. 12

    GNU가 모든 CLI 명령을 준수하기 위해 "--json"매개 변수를 추가하도록 주장하는 방법은 무엇입니까?

  13. 13

    종료 후크를 만드는 가장 좋은 방법은 무엇입니까?

  14. 14

    종료 후크를 만드는 가장 좋은 방법은 무엇입니까?

  15. 15

    종료 후크를 만드는 가장 좋은 방법은 무엇입니까?

  16. 16

    XBMC 용 DVD를 백업하는 가장 좋은 방법은 무엇입니까?

  17. 17

    봄에 부모 클래스 필드를 autowire하기 위해 가장 좋은 방법은 무엇입니까?

  18. 18

    removeSuffix ()를 작성하는 가장 좋은 방법은 무엇입니까?

  19. 19

    목록을 반복하고 Java에서 종료하는 가장 좋은 방법은 무엇입니까?

  20. 20

    PowerShell : Write-Debug를 통해 변수 내용을 표시하는 '가장 좋은'방법은 무엇입니까?

  21. 21

    메시지를 연기하는 가장 좋은 방법은 무엇입니까?

  22. 22

    Java8 기능을 통해 결과를 얻을 수있는 가장 좋은 방법은 무엇입니까?

  23. 23

    DirectShow에서 PAR (픽셀 종횡비) 문제를 해결하는 가장 좋은 방법은 무엇입니까?

  24. 24

    기본 50/50 분할 대신 하위 하위보기가 공간의 2/3를 차지하도록하는 가장 좋은 방법은 무엇입니까?

  25. 25

    Angular2 : 지시문과 서비스를 모두 포함하는 기능을 모듈로 분해하는 가장 좋은 방법은 무엇입니까?

  26. 26

    Powershell IDE : Powershell ISE를 종료하지 않고 모든 변수를 지우기 위해 대화 형 셸을 다시 시작하는 방법은 무엇입니까?

  27. 27

    pytest에서 테스트를 위해 여러 부울 조합을 지원하는 가장 좋은 방법은 무엇입니까?

  28. 28

    새해로가는 주 번호를 쿼리하는 가장 좋은 방법은 무엇입니까?

  29. 29

    Ruby 단위 테스트를 위해 StringIO 입력을 모의하는 가장 좋은 방법은 무엇입니까?

뜨겁다태그

보관