개체 상태가 변경되기 전에 이벤트를 발생시키는 규칙에 따라 취소 가능한 이벤트를 노출하는 클래스가 있습니다. 일단 상태가 변경되면 이벤트가 발생합니다. 게시자 (서버)가 노출 한 변경 전 이벤트는 StateChanging
의 형식이고 인수는 CancelEventArgs
이며 변경 후 이벤트는 StateChanged
입니다. 이것은 이벤트의 구독자 (클라이언트)에게 시작하기 전에 작업을 취소 할 수있는 기능을 제공합니다.(클라이언트가 초기화하지 않고 서버 측에서 시작해야하는 장기 실행 작업을 취소하는 방법)
이제는 이러한 작업 중 하나를 장기 실행 작업으로 변경했으며 구독자에게 작업이 시작된 후에도 작업을 취소 할 수있는 가능성을 부여하고 작업 진행 상황도 알고 싶습니다. 나는 event-based asynchronous pattern을 생각했다.
문제점은 비동기 패턴에서 클라이언트가되는 것처럼 보이지만 게시자는 어느 시점에서 작업을해야하기 때문에 변경 전 및 변경 후 이벤트 패턴을 유지하고 싶습니다. 특히 특정 작업을 비동기 적으로 실행하도록 요청합니다. 클라이언트에게 서버 측에서 수행해야 할 작업을 알 수있게하고 그에 따라 RunOperationAsync()
메서드를 호출 할 수있는 이벤트 (예 : OperationRequired
)를 서버에 표시하도록 할 수도 있습니다. 댓글을 달고 제안 사항을 추가하십시오.
BackgroundWorker에 대해 알고 있지만 특정 시점에 특별히 요청되지 않은 작업을 시작하는 서버를 사용하는 경우 올바른 방법을 사용하지 못합니다. 나는 더 잘 설명하려고한다. 클라이언트는 특정 작업 X를 요청하고 서버는 정상적으로 작업 X를 수행한다. 때로는 서버가 상태 Y 이전에 Y 작업을 수행해야하므로 Y 서버가 장시간 실행될 수 있으므로 서버는 Y 서버를 시작한다는 사실을 클라이언트에 알리고 클라이언트가 Y 서버를 취소 할 수있게해야합니다 (차례대로 X도 취소됩니다). –
클라이언트가 Y를 기다릴 준비가되었는지 여부를 미리 알고있는 경우 서버 객체에 속성을 설정할 수 있습니다 (예 : 'bool CancelIfYRequired'). 그러면'xxxAsync' 메소드가 호출됩니다. 또는 추가 매개 변수로 전달할 수 있습니다. 마찬가지로 'xxxCompletedEventArgs' 클래스에 속성을 추가하여이 조건으로 인해 작업이 취소 된 시점을 나타낼 수 있습니다. 귀하의'CancelAsync' 메소드는 Y 또는 X 중 하나를 수행하는 동안 취소를 지원해야합니다. –