0

우리는 WinForms에 잘 작동하는 .Net 구성 요소를 개발했습니다. 이 구성 요소는 SynchronizationContext을 사용하여 UI 스레드로 마샬링하는 기본 스레드의 이벤트를 발생시킵니다 (물론 구성 요소는 WindowsFormsSynchronizationContext을 자동으로 가져 와서 이벤트를 응용 프로그램의 UI 스레드에 게시하는 데 사용합니다).Windows 서비스 용 .net 구성 요소의 AsyncOperationManager

이제이 구성 요소를 다시 사용하여 NT 서비스를 만들고 싶습니다. Windows 서비스는 SynchronizationContext을 자동으로 제공하지 않으므로이 구성 요소의 기본 스레드에서 시작된 모든 이벤트를 단일 프로세서 스레드로 마샬링하기 위해 AsyncOperationManager (및 해당 SynchronizationContext)을 사용할 수 있다고 생각했습니다. 이것이 좋은 접근일까요?

내 테스트에서 다른 스레드의 AsyncOperationManager.CreateOperation(null); 호출을 사용하여 게시 된 비동기 작업 (하나는 MyService.OnStart() 메서드 실행 중 ... 다른 하나는 내 서비스에서 실행되는 내부 처리 스레드)의 동작을 확인했습니다. 놀랍게도 게시 된 비동기 작업의 스레드 ID는 항상 MyService.OnStart() 메서드를 실행하는 스레드 ID 였으므로 아마도 SCM 스레드 일 것입니다.

이 문제에 관해 MSDN에는 문서가 부족하지만, AsyncOperationManager.CreateOperation을 호출하는 스레드는 비동기 작업을 마샬링 할 것이라고 생각했습니다.

여기에 빛을 비추는 사람이 있습니까? 또한, Windows 서비스에서이 AsyncOperationManager을 사용하려는 나의 의도에 뭔가 잘못된 점이 있습니까? 다른 방법은 무엇입니까?

+0

아니요, 실제로 작업을 수행하는 것은 WindowsFormsSynchronizationContext입니다. 당신은 봉사하는 사람이 없습니다. 실제로 스레드에서 Application.Run()을 호출하여 하나를 얻을 수 있습니다. –

+0

* 왜 * SynchronoizationContext가 필요합니까? – usr

+0

@HansPassant : AsyncOperationManager가 나에게 도움이된다고 생각하지 않습니까? WinFormsSynchCtx가 WinForms에서 WinFormsSynchCtx를 사용한다는 것을 알고 있습니다. 이 서비스에서는 컴포넌트의 기본 스레드에서 모든 이벤트를 단일 프로세서 스레드로 쉽게 마샬링하고 싶습니다. – Learner

답변

0

다른 스레드에서 요청을 가져와 다시 응답을 생성하는 프로세서 스레드로 구성된 자체 스레딩 모델을 만들었습니다.

관련 문제