백그라운드 작업자를 취소하고 오류 메시지를 다시 전달하려면 어떻게해야합니까? 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] 삭제
몇 마디 만하겠습니다