2014-01-10 4 views
1

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

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

+1

왜 취소 하시겠습니까? [문서] (http://msdn.microsoft.com/en-us/library/system.componentmodel.runworkercompletedeventargs.result (v = vs.110) .aspx)에 따르면 'Result' 속성은'InvalidOperationException '당신이 그 일을 취소하면. 그런데 왜 그걸하고 ** ** 결과 *를 기대합니까? 기본적으로 당신의 질문은 "내가 X를 할 때 Y가 일어날 것이라고 말하는 문서가있다. 나는 X를하고있다. 왜 Y가 일어나는가? 어떻게 Y가 일어나지 않도록 할 수 있는가?". 대답은 "Do not do X"라고 가정합니다. 따라서 작업을 취소하지 마십시오. –

답변

1

장기 실행 프로세스가 취소 된 경우 프로세스가 완전히 완료되지 않았으므로 실제로 "결과"가 없습니다. documentation에 따르면

:

귀하의 RunWorkerCompleted 이벤트 핸들러는 항상 결과의 속성에 액세스하기 전에 오류 및 취소 속성을 확인해야합니다. 예외가 발생하거나 작업이 취소 된 경우 Result 속성에 액세스하면 예외가 발생합니다.

BackgroundWorker을 들여다 보았습니다.

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

을 그리고 RaiseExceptionIfNecessary()의 내용 : 다음은 Result 속성의 내용입니다 당신이 스레드를 취소 그렇다면

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")); 
} 

InvalidOperationException가 발생합니다 Result를 참조. 그것이 설계된 방식 일뿐입니다.

"최상의"방법으로 문자열을 다시 전달하는 것이 무엇인지 알 수 없습니다. BackgroundWorker를 실행하는 동일한 메서드에서 변수를 정의하고 DoWork 이벤트에서 값을 할당 할 수 있다고 말하고 싶습니다.

UI 스레드의은 아무 래도 변수에 바인딩되거나 문제가 발생할 수 있다는 점에 매우주의해야합니다. 문자열은 안전해야하지만 ComboBox 또는 뭔가에 바인딩 된 목록을 추가하지 마십시오.

관련 문제