2017-09-28 12 views
1

다른 클래스에서 제공하는 일부 메소드를 사용하는 직렬 포트에서 작동하는 Backgroundworker를 만들었습니다. 이러한 메서드에서 예외가 발생할 때마다 작업자를 취소하고 싶습니다.메소드 코드 일부에서 백그라운드 작업자를 취소하는 방법

사실, 나는 이벤트를 사용하여 그것을 어떻게하는지 약간의 아이디어가 있지만, 최적의 해결책이나 좋은 습관이 아닌 것 같아 걱정됩니다. 그럴 경우 각 방법마다 이벤트를 발생시켜야하는데 이는 제 의견으로는 효율적이지 않습니다. . 예를 들어

, 방법 하나, ReceiveRecord은 다음과 같습니다

public string ReceiveRecord() 
{ 
    try 
    { 
     var receivedLine = _serial.ReadLine(); 
     return receivedLine; 
    } 
    catch (TimeoutException exception) 
    { 
     MessageBox.Show($"Error was occured: \r\n {exception.Message}", "Timeout error", 
      MessageBoxButton.OK, MessageBoxImage.Error); 
     // HERE i want to fire worker cancellation 

    } 
    return String.Empty; 
} 

노동자가 그 방법을 주기적으로 호출합니다.

는 캐치에서 취소를 DoWork 발사 할 수있는 간단한 방법이 있습니까 ...

나는 오류가 발생하면 false를 반환 고려,하지만 난 방법을 string을 반환하는 경우 어떤 생각이 어떻게 그것을 할 필요가 없습니다 코드 조각?

+0

당신은'사용 밖으로 bool' 매개 변수 또는 예외의 경우 null을 반환하거나 다시 호출자에게 예외를 던져 그것을의 –

+0

가능한 중복을 취소하려고 캐치 거기 확인할 수 있습니다 [제대로 BackgroundWorker에 정지하는 방법 (https://stackoverflow.com/questions/4732737/how-to-stop-backgroundworker-correctly) – oRole

답변

0

메서드에서 예외를 catch하지 마십시오. 호출자가 BackgroundWorker의 RunWorkerCompleted 이벤트에서 처리하도록합니다.

BackgroundWorker 클래스는 근로자가 취소를 지원하는지 여부 작업자를 알려주는 WorkerSupportsCancellation 부울을 가지고 Background worker exception handling

+0

예외는 RunWorkerCompleted 이벤트를 발생합니까? DoWork가 실행되는 동안 처리되지 않은 예외가 발생합니까? – Morpheus

+0

스레드가 중단되고 RunWorkerCompletedEventArgs가 .Error 속성이 설정된 RunWorkerCompleted 이벤트로 전송됩니다. RunWorkerCompleted 내부에서 .Error의 메시지가 포함 된 예외를 throw합니다. 내 대답의 링크를 참조하십시오. – digimunk

+0

좋아, 지금까지 이벤트를 사용했지만 나에게 그 사실을 분명히 했으므로 나중에 구현합니다. 나는 메서드에서 모든 예외를 catch하는 데 사용되는 것처럼 빨리, 가능한 한 더 안전하다고 생각하게 만들었습니다. – Morpheus

0

를 참조하십시오. backgroundworker DoWork 이벤트에서 이것을 활성화하고 CancellationPending이 맞는지 확인하십시오. 참이면 스레드를 종료하고, 그렇지 않으면 정상적으로 계속하십시오.

CancelAsync() 함수를 사용하여 취소 보류를 true로 설정하십시오. catch 블록에서이 값을 설정하려고합니다.

내 예제에서는 백그라운드 작업자가 while 루프에 있지만 올바른 아이디어를 제공합니다.

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    try 
    { 
     while (true) 
     { 
      if (bw.CancellationPending) 
       break; 

      do_state_machine(); 
      Thread.Sleep(100); 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
}