취소 된 BackgroundWorker 스레드에서 기본 스레드로 결과 전달

RobPio

백그라운드 작업자를 취소하고 오류 메시지를 다시 전달하려면 어떻게해야합니까? DoWorkEventArgs e.Results결과를 주 스레드로 다시 전달 하는 사용할 수 있지만 e.Results자식 스레드를 취소하면 덮어 쓰여집니다. 예:

private MyProgram_DoWork(object sender, DoWorkEventArgs e)
{
     e.Cancel = true;
     e.Result = "my error message";
     return;
}

private void MyProgram_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
     if ((e.Cancelled == true))
     { 
            string ErrorMsg = (string)e.Result;   //exception happens here 

            ....
     }
     else
     { 
          // success code
     }
}

내 자식 스레드를 중지하고 문자열을 다시 기본 스레드로 보내는 다른 방법이 있습니까?

그랜트 위니

장기 실행 프로세스가 취소되면 프로세스가 완전히 완료되지 않았기 때문에 실제로 "결과"가 표시되지 않습니다.

문서 에 따르면 :

RunWorkerCompleted 이벤트 처리기는 Result 속성에 액세스하기 전에 항상 Error 및 Canceled 속성을 확인해야합니다. 예외가 발생하거나 작업이 취소 된 경우 Result 속성에 액세스하면 예외가 발생합니다.

나는 내부를 들여다 보았다 BackgroundWorker. Result속성 의 내용은 다음과 같습니다 .

public object Result
{
  get
  {
    this.RaiseExceptionIfNecessary();
    return this.result;
  }
}

그리고 내용 RaiseExceptionIfNecessary():

protected void RaiseExceptionIfNecessary()
{
  if (this.Error != null)
    throw new TargetInvocationException(SR.GetString("Async_ExceptionOccurred"), this.Error);
  if (this.Cancelled)
    throw new InvalidOperationException(SR.GetString("Async_OperationCancelled"));
}

따라서 스레드를 취소하면 참조 Result하면 InvalidOperationException. 그것이 디자인 된 방식입니다.

문자열을 다시 전달하는 "가장 좋은"방법이 무엇인지 모르겠습니다. BackgroundWorker를 실행하는 것과 동일한 방법으로 변수를 정의하고 DoWork이벤트 에서 값을 할당 할 수 있다고 말하고 싶습니다 .

UI 스레드의 어떤 것도 변수에 바인딩되어 있지 않거나 문제가 발생할 수 있다는 점에 매우주의해야 합니다. 문자열은 안전해야하지만 ComboBox 등에 바인딩 된 목록에는 추가하지 마세요.

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

다중 스레드 (즉, 스레드 기반) Java 응용 프로그램에서 손상된 결과

분류에서Dev

BackgroundWorker는 백그라운드 스레드에서 수행 된 메모리 변경 사항이 기본 스레드에 표시되도록 보장합니까?

분류에서Dev

스레드에서 기본 활동으로 값 전달

분류에서Dev

스레드에서 결과 얻기

분류에서Dev

레지스터에 전달 된 인수 주소 가져 오기

분류에서Dev

스레드 A에서 B로 Java 소켓 전달

분류에서Dev

구조체 (C)를 통해 스레드에 전달 된 mmap 출력에 쓰기

분류에서Dev

C #에서 스레드 안전 소켓 클래스 만들기

분류에서Dev

스레드를 향상시키기 위해 전달 된 함수의 모호성을 해결하는 방법

분류에서Dev

STA 스레드에서 생성 된 COM RWC가 스레드 종료시 기본 COM 개체와의 연결을 끊는 것이 정상입니까?

분류에서Dev

사용자 정의 클래스를 기본 메소드에서 parametrizedthreadstart 클래스로 전달

분류에서Dev

소수 잘못된 결과가있는 자바 스크립트 "기본"합계

분류에서Dev

호출자에 영향을주지 않는 메소드에 매개 변수로 전달 된 증가 기본 래퍼 클래스

분류에서Dev

기본 레일 조인 .. 결과는 리소스

분류에서Dev

클래스를 스레드하고 기본 활동 클래스에 정보를 TextView로 전달합니다.

분류에서Dev

여러 스레드에서로드하기 전에 저장소를 어떻게 동기화합니까?

분류에서Dev

async / await에서 스레드 취소

분류에서Dev

Ruby에서 실시간으로 생성 된 새 스레드의 결과를 비동기 적으로 수집하는 방법

분류에서Dev

기본 클래스를 사용하여 상속 구성 요소를 매개 변수로 메서드에 전달

분류에서Dev

C에서 세분화 된 스레드 안전한 연결 목록

분류에서Dev

Java에서 동일한 클래스의 다른 동기화 된 메소드 내부에 생성 된 새 스레드에서 동기화 된 메소드 호출

분류에서Dev

오버로드 된 메서드에 매개 변수로 전달할 때 기본 클래스와 파생 클래스를 구분합니다.

분류에서Dev

데이터베이스에서 잘못된 결과 얻기-PHP를 사용하는 레코드의 특정 필드에 대한 잘못된 계산

분류에서Dev

원자로드 및 저장과 동기화 된 스레드간에 변수를 공유하는 것이 안전합니까?

분류에서Dev

시작된 순서대로 스레드 시작, 이전 스레드가 완료된 경우에만

분류에서Dev

backgroundworker 및 다른 스레드

분류에서Dev

OpenLayers3 레이어 소스 URL 변경 (또는 다른 URL에서로드 된 기능 대체)

분류에서Dev

스레드 작업 취소

분류에서Dev

스레드에 전달 된 신호를 아는 방법

Related 관련 기사

  1. 1

    다중 스레드 (즉, 스레드 기반) Java 응용 프로그램에서 손상된 결과

  2. 2

    BackgroundWorker는 백그라운드 스레드에서 수행 된 메모리 변경 사항이 기본 스레드에 표시되도록 보장합니까?

  3. 3

    스레드에서 기본 활동으로 값 전달

  4. 4

    스레드에서 결과 얻기

  5. 5

    레지스터에 전달 된 인수 주소 가져 오기

  6. 6

    스레드 A에서 B로 Java 소켓 전달

  7. 7

    구조체 (C)를 통해 스레드에 전달 된 mmap 출력에 쓰기

  8. 8

    C #에서 스레드 안전 소켓 클래스 만들기

  9. 9

    스레드를 향상시키기 위해 전달 된 함수의 모호성을 해결하는 방법

  10. 10

    STA 스레드에서 생성 된 COM RWC가 스레드 종료시 기본 COM 개체와의 연결을 끊는 것이 정상입니까?

  11. 11

    사용자 정의 클래스를 기본 메소드에서 parametrizedthreadstart 클래스로 전달

  12. 12

    소수 잘못된 결과가있는 자바 스크립트 "기본"합계

  13. 13

    호출자에 영향을주지 않는 메소드에 매개 변수로 전달 된 증가 기본 래퍼 클래스

  14. 14

    기본 레일 조인 .. 결과는 리소스

  15. 15

    클래스를 스레드하고 기본 활동 클래스에 정보를 TextView로 전달합니다.

  16. 16

    여러 스레드에서로드하기 전에 저장소를 어떻게 동기화합니까?

  17. 17

    async / await에서 스레드 취소

  18. 18

    Ruby에서 실시간으로 생성 된 새 스레드의 결과를 비동기 적으로 수집하는 방법

  19. 19

    기본 클래스를 사용하여 상속 구성 요소를 매개 변수로 메서드에 전달

  20. 20

    C에서 세분화 된 스레드 안전한 연결 목록

  21. 21

    Java에서 동일한 클래스의 다른 동기화 된 메소드 내부에 생성 된 새 스레드에서 동기화 된 메소드 호출

  22. 22

    오버로드 된 메서드에 매개 변수로 전달할 때 기본 클래스와 파생 클래스를 구분합니다.

  23. 23

    데이터베이스에서 잘못된 결과 얻기-PHP를 사용하는 레코드의 특정 필드에 대한 잘못된 계산

  24. 24

    원자로드 및 저장과 동기화 된 스레드간에 변수를 공유하는 것이 안전합니까?

  25. 25

    시작된 순서대로 스레드 시작, 이전 스레드가 완료된 경우에만

  26. 26

    backgroundworker 및 다른 스레드

  27. 27

    OpenLayers3 레이어 소스 URL 변경 (또는 다른 URL에서로드 된 기능 대체)

  28. 28

    스레드 작업 취소

  29. 29

    스레드에 전달 된 신호를 아는 방법

뜨겁다태그

보관