추가 예외 처리가있는 비동기 Task <T>에 대한 시간 초과

아저씨. 아무도

내 프로젝트에서 동적 링크 라이브러리의 유형과 인터페이스를 참조합니다. 이 특정 라이브러리를 사용할 때 가장 먼저해야 할 일은 라이브러리 EA.Repository내에 정의되고 추가 사용을위한 진입 점 역할을 하는의 인스턴스를 만드는 것입니다.

인스턴스화 EA.Repository repository = new EA.Repository()는 백그라운드에서 복잡한 작업을 수행하며 세 가지 가능한 결과에 직면했습니다.

  1. 인스턴스화에는 약간의 시간이 걸리지 만 결국 성공적으로 완료됩니다.
  2. 예외가 발생합니다 (즉시 또는 얼마 후)
  3. 인스턴스화는 영원히 차단됩니다 (이 경우 취소하고 사용자에게 알리고 싶습니다).

다음을 사용하여 비동기식 접근 방식을 생각 해낼 수있었습니다 Task.

public static void Connect()
{
    // Do the lengthy instantiation asynchronously
    Task<EA.Repository> task = Task.Run(() => { return new EA.Repository(); });

    bool isCompletedInTime;

    try
    {
        // Timeout after 5.0 seconds
        isCompletedInTime = task.Wait(5000);
    }
    catch (Exception)
    {
        // If the instantiation fails (in time), throw a custom exception
        throw new ConnectionException();
    }

    if (isCompletedInTime)
    {
        // If the instantiation finishes in time, store the object for later
        EapManager.Repository = task.Result;
    }
    else
    {       
        // If the instantiation did not finish in time, throw a custom exception
        throw new TimeoutException();
    }
}

(아마도 여기에서 이미 많은 문제를 발견 할 수 있습니다. 잠시만 기다려주세요 ... 권장 사항을 주시면 감사하겠습니다!)

이 방법은 지금까지 작동합니다. "예외"및 "시간 초과"시나리오를 모두 시뮬레이션 할 수 있으며 원하는 동작을 얻을 수 있습니다.

그러나 다른 경우를 확인했습니다. 인스턴스화 작업이 시간 초과가 만료되고 예외가 발생하는 데 충분히 오래 걸린다고 가정 해 보겠습니다. 이 경우 AggregateException작업이 관찰되지 않았다는 말이 나오기도 합니다.

나는 이것에 대한 실행 가능한 해결책을 찾기 위해 고군분투하고 있습니다. 차단 인스턴스화로 인해 CancellationToken접근 방식 을 사용하지 못하기 때문에 제한 시간이 만료되면 작업을 취소 할 수 없습니다 .

내가 생각 해낼 수있는 유일한 방법은 내 커스텀을 던지기 직전에 비동기 적으로 작업을 관찰 (즉, 다른 작업을 시작)하는 것입니다 TimeoutException.

Task observerTask = Task.Run(() => {
    try { task.Wait(); }
    catch (Exception) { }
});

throw new TimeoutException();

물론 인스턴스화가 정말 영원히 차단된다면, 이미 첫 번째 작업이 끝나지 않았을 것입니다. 관찰자 작업으로 이제 두 개도 있습니다!

이 모든 접근 방식에 대해 매우 안전하지 않으므로 어떤 조언도 환영합니다!

미리 감사드립니다!

테오도르 줄리아 스

다음은 관찰되지 않는 동안 실패 할 수있는 작업을 명시 적으로 관찰하는 데 사용할 수있는 확장 방법입니다.

public static Task<T> AsObserved<T>(this Task<T> task)
{
    task.ContinueWith(t => t.Exception);
    return task;
}

사용 예 :

var task = Task.Run(() => new EA.Repository()).AsObserved();

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

시간 초과가있는 예외를 무시하고 Kotlin 코 루틴에서 여러 비동기 결과를 수집합니다.

분류에서Dev

큰 파일 스트리밍에 대한 WCF 시간 초과 예외

분류에서Dev

결과에 기초하는 방법을 시도 (대신 예외)

분류에서Dev

사용자 지정 예외에 대한 처리기가있는 위치

분류에서Dev

requirejs가있는 모듈에 대한로드 시간 초과

분류에서Dev

시간 초과 검사 내에서 Func <Task <IResponse >>의 결과 가져 오기

분류에서Dev

권한을 부여하는 동안 Facebook 그래프 API가 시간 초과 예외를 반환합니다.

분류에서Dev

예상대로 작동하지 않는 시도 / 예외 : "예외"오류 메시지가 통과 결과에 추가됩니다.

분류에서Dev

내 스트림에서 읽기 / 쓰기 시간 초과 예외가 계속 발생합니다.

분류에서Dev

페이로드가 특정 크기를 초과하면 "비동기 작업 시간 초과"예외와 함께 Java REST API 호출이 실패합니다.

분류에서Dev

가능한 여러 예외에 대한 단일 예외 처리기

분류에서Dev

loopj에서 시간 초과 예외 처리

분류에서Dev

대용량 데이터에 대한 MongoDB 집계 시간 초과 예외

분류에서Dev

시간 초과가있는 Node.js 비동기 반복

분류에서Dev

Java에서 비동기 호출에 제한 시간 추가

분류에서Dev

SQL 명령에 대한 명령 시간 초과 늘리기

분류에서Dev

iOS-AFHTTPRequestOperationManager에 대한 시간 초과 늘리기

분류에서Dev

cancancan + devise : 시간 초과 예외 처리

분류에서Dev

asyncio로 예외 후 선물을 다시 대기열에 추가

분류에서Dev

원격 서버에 파일을 scp하는 동안 시간 초과를 추가하는 방법 및 예상 스크립트를 통해 sudo에 대한 권한이없는 경우

분류에서Dev

비동기가 아닌 람다를 사용한 Task.Run 예외

분류에서Dev

Visual Studio (즉시 창)에서 처리 된 예외에 대한 자세한 정보 가져 오기

분류에서Dev

noSuchMethod 예외 Dart에 대한 라인 강조 표시 (또는 최소한 스택 추적) 가져 오기

분류에서Dev

시간 초과가있는 스레드 대기 중 : 고정

분류에서Dev

대기열 및 시간 초과 문제가있는 TaskScheduler

분류에서Dev

시간 초과가있는 PipeReader에서 읽기

분류에서Dev

Cassandra cql 선택 쿼리가 항상 읽기 시간 초과 예외를 발생시킵니다.

분류에서Dev

비동기 작업을 시작하고 그 결과를 루프에서 기다리는 사이에 어떻게 유예 기간을 가질 수 있습니까?

분류에서Dev

ngShow의 시간 초과가 예상대로 작동하지 않습니다.

Related 관련 기사

  1. 1

    시간 초과가있는 예외를 무시하고 Kotlin 코 루틴에서 여러 비동기 결과를 수집합니다.

  2. 2

    큰 파일 스트리밍에 대한 WCF 시간 초과 예외

  3. 3

    결과에 기초하는 방법을 시도 (대신 예외)

  4. 4

    사용자 지정 예외에 대한 처리기가있는 위치

  5. 5

    requirejs가있는 모듈에 대한로드 시간 초과

  6. 6

    시간 초과 검사 내에서 Func <Task <IResponse >>의 결과 가져 오기

  7. 7

    권한을 부여하는 동안 Facebook 그래프 API가 시간 초과 예외를 반환합니다.

  8. 8

    예상대로 작동하지 않는 시도 / 예외 : "예외"오류 메시지가 통과 결과에 추가됩니다.

  9. 9

    내 스트림에서 읽기 / 쓰기 시간 초과 예외가 계속 발생합니다.

  10. 10

    페이로드가 특정 크기를 초과하면 "비동기 작업 시간 초과"예외와 함께 Java REST API 호출이 실패합니다.

  11. 11

    가능한 여러 예외에 대한 단일 예외 처리기

  12. 12

    loopj에서 시간 초과 예외 처리

  13. 13

    대용량 데이터에 대한 MongoDB 집계 시간 초과 예외

  14. 14

    시간 초과가있는 Node.js 비동기 반복

  15. 15

    Java에서 비동기 호출에 제한 시간 추가

  16. 16

    SQL 명령에 대한 명령 시간 초과 늘리기

  17. 17

    iOS-AFHTTPRequestOperationManager에 대한 시간 초과 늘리기

  18. 18

    cancancan + devise : 시간 초과 예외 처리

  19. 19

    asyncio로 예외 후 선물을 다시 대기열에 추가

  20. 20

    원격 서버에 파일을 scp하는 동안 시간 초과를 추가하는 방법 및 예상 스크립트를 통해 sudo에 대한 권한이없는 경우

  21. 21

    비동기가 아닌 람다를 사용한 Task.Run 예외

  22. 22

    Visual Studio (즉시 창)에서 처리 된 예외에 대한 자세한 정보 가져 오기

  23. 23

    noSuchMethod 예외 Dart에 대한 라인 강조 표시 (또는 최소한 스택 추적) 가져 오기

  24. 24

    시간 초과가있는 스레드 대기 중 : 고정

  25. 25

    대기열 및 시간 초과 문제가있는 TaskScheduler

  26. 26

    시간 초과가있는 PipeReader에서 읽기

  27. 27

    Cassandra cql 선택 쿼리가 항상 읽기 시간 초과 예외를 발생시킵니다.

  28. 28

    비동기 작업을 시작하고 그 결과를 루프에서 기다리는 사이에 어떻게 유예 기간을 가질 수 있습니까?

  29. 29

    ngShow의 시간 초과가 예상대로 작동하지 않습니다.

뜨겁다태그

보관