2011-04-13 6 views
0

나는 BeginSomething()EndSomething() 쌍의 인터페이스를 구현하고, 내 구현하는 방법 Execute()BeginInvoke 내 대리자가 될 스레드의 본질을 수정할 수 있습니까?

에 그래서 나는 Action action = Execute를 작성하고 EndSomething에서 BeginSomething에서 action.BeginInvokeaction.EndInvoke를 호출합니다. 그러나 Execute 메서드는 아파트 상태가 STA (단일 스레드 아파트) 인 스레드에 의해 호출되어야합니다. 일반적으로 Thread.SetApartmentState을 호출하여이 작업을 수행하지만,이 경우에는 어떤 스레드가 내 메서드를 호출 할 것인지 알지 못합니다.

어떻게 호출 스레드를 STA로해야합니까?

답변

2

클래스가 인터페이스 당 시작/종료 쌍 메소드를 구현하는 경우 작업이 실제로 수행되는 방식을 제어 할 수 있습니다. 대리자 (Action은 형식화 된 generic 임)는 내가 믿는 기본 스레드 풀을 사용하므로 공유 된 재사용 가능한 스레드에 의해 수행됩니다. 스레드 풀을 망쳐 놓는 것이 실현 가능하지 않기 때문에,이 경우에는 직선의 델리게이트가 필요 없습니다.

새로운 ThreadStart를 메소드에 전달하고 이미 지정한대로 아파트 객체를 설정해야합니다. 이 메소드는 콜백에 대한 고유 한 방법을 가지고 있어야합니다. 바닐라 스레드는 내 지식에 편리한 방법을 제공하지 않기 때문입니다.

.NET 4.0을 사용하는 경우 Tasks과 함께 a custom StaTaskScheduler을 선택적으로 사용할 수도 있지만, 많은 의존성을 추가하기 때문에 더 많은 문제가 발생할 수 있습니다. 그것은 콜백 문제를 제거합니다.

관련 문제