2011-11-16 3 views
0

첫 번째 명령문 이후에 두 번째 명령문이 실행되도록 보장 할 수있는 방법이 있습니까?DispatcherObjectInvoker.Invoke를 사용할 때 하나의 메소드가 다음에 실행되도록 보장하는 방법이 있습니까

DispatcherObjectInvoker.Invoke(_layouts, 
    () => 
     _layouts.RaiseEvent(new LayoutEventArgs(
      MainScreen.ChangedLayoutEvent, 
      this))); 

DispatcherObjectInvoker.Invoke(_layouts, Grid.Refresh); 

첫 번째 문을 터치 한 그리드에 액세스하고 있습니다. 그리드의 새로 고침은 사례의 약 80 %에서만 작동합니다. 나는 분명히 경쟁 조건을 가지고있다.

+1

무엇이'DispatcherObjectInvoker'입니까? 그냥'디스패처 '인가요? – BrokenGlass

답변

3

둘 모두를 동일한 동작으로 만들어 보지 않겠습니까?

DispatcherObjectInvoker.Invoke(_layouts,() => 
{ 
    _layouts.RaiseEvent(new LayoutEventArgs(MainScreen.ChangedLayoutEvent, 
              this)); 
    Grid.Refresh(); 
}); 
0

확실하지 무엇 DispatcherObjectInvoker입니다,하지만 난 그게 Dispatcher 또는 무언가에 대한 래퍼입니다 가정합니다.

해당하는 경우 Invoke()으로 전화하면 차단 호출입니다. 두 번째 전화는 귀하의 첫 번째 전화 후에 보장됩니다.

그러나 비동기 호출을 사용하려는 경우 BeginInvoke을 사용해야합니다. DispatcherPriority 매개 변수는 동일한 우선 순위 수준의 호출이 동일한 순서로 이루어 지도록합니다. 따라서 _layoutsDispatcherPriority.Loaded 우선 순위 (또는 다른 우선 순위)를 나타내는 경우 호출은 동일한 순서로 보장됩니다.

MSDNdocumentation을 확인하십시오.

관련 문제