우리는 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
을 사용하려는 나의 의도에 뭔가 잘못된 점이 있습니까? 다른 방법은 무엇입니까?
아니요, 실제로 작업을 수행하는 것은 WindowsFormsSynchronizationContext입니다. 당신은 봉사하는 사람이 없습니다. 실제로 스레드에서 Application.Run()을 호출하여 하나를 얻을 수 있습니다. –
* 왜 * SynchronoizationContext가 필요합니까? – usr
@HansPassant : AsyncOperationManager가 나에게 도움이된다고 생각하지 않습니까? WinFormsSynchCtx가 WinForms에서 WinFormsSynchCtx를 사용한다는 것을 알고 있습니다. 이 서비스에서는 컴포넌트의 기본 스레드에서 모든 이벤트를 단일 프로세서 스레드로 쉽게 마샬링하고 싶습니다. – Learner