2012-03-27 3 views
2

다른 오픈 소스 프로젝트를 통해 다른 방법으로 동일한 문제에 접근하는 느낌을 얻으 려합니다. 이번에는 Event Aggregators, 특히 Caliburn.Micro의 이벤트 수집기입니다.UI에서 호출하는 방법을 이해하려고 시도했습니다. 스레드

나는 Rob이 제공하는 스레드가 없다면 EA가 UI 스레드를 마샬링합니다. 라인은 특히 다음과 같습니다에 대한 더 다음

public static Action<System.Action> 
DefaultPublicationThreadMarshaller = action => action(); 

과 :

marshal(() => 
     { 
      *SNIP* 
     }); 

이해가 안 돼요 어떻게 자신의 당신이 모든 작업을 호출이이 UI 스레드에서 호출됩니다 말할 수있는 방법 당신이 지정하지 않는 한 UI 스레드? (btw라고하는 동작을 지정할 수 있습니다. 위의 줄은 동작이 제공되지 않는 경우입니다).

+0

UI 스레드에서이 문제를 일으키는 원인은 아무 것도 없습니다. 'DefaultPublicationThreadMarshaller'는 단순히 현재 실행중인 쓰레드의 액션을 호출합니다. UI 스레드에 대한 언급은 어디에서 찾을 수 있습니까? – Groo

+0

이러한 자동 동작이 없습니다. 아마도 그것은 마샬()이 어떻게 설계되고 구현되었는지에 관한 것입니다. –

답변

1

조치 중 하나를 호출 스레드에서 호출 할 수 있습니다

Action a =() => Foo(); 
a.Invoke(); 

또는 이벤트 수집기는 그것이 다음 동기 호출을 사용하도록 구성되어있는 경우 비동기

Action a =() => Foo(); 
a.BeginInvoke(); 

호출 할 수 있습니다 이벤트가 UI 스레드에서 처리 될 수 있습니다. 그러나 매우 드물 긴하지만 일반적으로 이벤트 수집기는 비동기 실행을 사용하며 작업은 스레드 풀에서 실행됩니다.

해당 코드에서 액션 (여기에는 내부적으로 포함되지 않음)에서 액션에 대한 호출 또는 BeginInvoke를 호출하는 곳이 있습니다. 여기에는 차이점이 있습니다.

N.B. 이 대답은 특정 이벤트 수집기에만 해당되는 것은 아닙니다.

관련 문제