2013-04-09 2 views
1

측정을 수행하기 위해 Winform 애플리케이션을 개발 중입니다. 측정은 로봇, 전원 공급 장치 등과 같은 외부 하드웨어를 필요로합니다.취소 가능 측정 알고리즘

측정 자체는 장시간 (약 20 분)이므로 배경 작업자에서 실행됩니다.

나를 위해 주요 문제는 측정 cancle-able를 디자인하는 방법입니다. 사용자가 예를 들어 뭔가 잘못하면 측정을 취소 할 수 있어야합니다. 그러나 측정은 모든 곳에서 취소되어서는 안됩니다. 예를 들어 IO -communication을 수행하는 동안 취소 할 수 없습니다. 또한 사용자가 취소하면 저장 shutdown이 있어야합니다.

문제는, 취소 관련 코드로 비즈니스 로직 (측정)을 오염시키고 싶지 않다는 것입니다.

어떻게하면 좋은 방법일까요?

비슷한 로직을 python에 입력했습니다. 측정을 상태 머신 (FSM)으로 구현했습니다. 각 상태 전환은 취소 지점이었습니다. 상태가 실행되는 동안 사용자가 취소 한 경우 상태 시스템은 finish 상태로 점프하여 안전한 종료가 발생했습니다.

+5

당신은 여전히 ​​자신에게 상태 머신을 만들거나 부울 플래그를 추가 할 수는 실행 –

+1

을 중단 또한 [관리 스레드 취소에 대한 문서]를 볼 수 있습니다 시간에 당신의 배경 코드 검사 (http://msdn.microsoft.com/en-gb/library/dd997364.aspx). –

답변

3

BackgroundWorker를 사용하기로 한 경우 (사용자가 제안한대로) CancellationPending 속성을 사용하여 사용자가 작업을 취소하려고 시도하는지 확인해야합니다. 상태 머신의 상태를 점검하면서이를 확인할 수 있습니다. 사이비 코드는 같을 수 있습니다

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    // Get the BackgroundWorker that raised this event. 
    var worker = sender as BackgroundWorker; 

    // run the state machine 
    var machine = new Machine(); 
    while (!machine.isComplete()) { 
    if (worker.CancellationPending) { 
     machine.safeFinish(); 
    } else { 
     machine.executeNextState(); 
    } 
    } 

    // Assign the result of the computation 
    e.Result = machine.result(); 
} 
관련 문제