2011-10-22 4 views
1

개체 상태가 변경되기 전에 이벤트를 발생시키는 규칙에 따라 취소 가능한 이벤트를 노출하는 클래스가 있습니다. 일단 상태가 변경되면 이벤트가 발생합니다. 게시자 (서버)가 노출 한 변경 전 이벤트는 StateChanging의 형식이고 인수는 CancelEventArgs이며 변경 후 이벤트는 StateChanged입니다. 이것은 이벤트의 구독자 (클라이언트)에게 시작하기 전에 작업을 취소 할 수있는 기능을 제공합니다.(클라이언트가 초기화하지 않고 서버 측에서 시작해야하는 장기 실행 작업을 취소하는 방법)

이제는 이러한 작업 중 하나를 장기 실행 작업으로 변경했으며 구독자에게 작업이 시작된 후에도 작업을 취소 할 수있는 가능성을 부여하고 작업 진행 상황도 알고 싶습니다. 나는 event-based asynchronous pattern을 생각했다.

문제점은 비동기 패턴에서 클라이언트가되는 것처럼 보이지만 게시자는 어느 시점에서 작업을해야하기 때문에 변경 전 및 변경 후 이벤트 패턴을 유지하고 싶습니다. 특히 특정 작업을 비동기 적으로 실행하도록 요청합니다. 클라이언트에게 서버 측에서 수행해야 할 작업을 알 수있게하고 그에 따라 RunOperationAsync() 메서드를 호출 할 수있는 이벤트 (예 : OperationRequired)를 서버에 표시하도록 할 수도 있습니다. 댓글을 달고 제안 사항을 추가하십시오.

답변

0

이벤트 기반 비동기 패턴은 일반적으로 UI로 제어되는 작업에 적합합니다. 비동기 프로그래밍 모델의 대안은 일반적으로 서버 또는 라이브러리 API에 선호됩니다. EAP를 구현하기로 결정했다면 괜찮습니다.

BackgroundWorker 구현을 살펴보십시오. 이는 다른 것들 중에서 취소를 지원하는 EAP의 가장 좋은 예입니다. 표준 CancelAsync() 방법을 통해 취소를 제공합니다.

+0

BackgroundWorker에 대해 알고 있지만 특정 시점에 특별히 요청되지 않은 작업을 시작하는 서버를 사용하는 경우 올바른 방법을 사용하지 못합니다. 나는 더 잘 설명하려고한다. 클라이언트는 특정 작업 X를 요청하고 서버는 정상적으로 작업 X를 수행한다. 때로는 서버가 상태 Y 이전에 Y 작업을 수행해야하므로 Y 서버가 장시간 실행될 수 있으므로 서버는 Y 서버를 시작한다는 사실을 클라이언트에 알리고 클라이언트가 Y 서버를 취소 할 수있게해야합니다 (차례대로 X도 취소됩니다). –

+0

클라이언트가 Y를 기다릴 준비가되었는지 여부를 미리 알고있는 경우 서버 객체에 속성을 설정할 수 있습니다 (예 : 'bool CancelIfYRequired'). 그러면'xxxAsync' 메소드가 호출됩니다. 또는 추가 매개 변수로 전달할 수 있습니다. 마찬가지로 'xxxCompletedEventArgs' 클래스에 속성을 추가하여이 조건으로 인해 작업이 취소 된 시점을 나타낼 수 있습니다. 귀하의'CancelAsync' 메소드는 Y 또는 X 중 하나를 수행하는 동안 취소를 지원해야합니다. –