2013-10-11 2 views
0

invokeAsync에 대한 질문이 있고 cal 명령을 신뢰할 수있는 것으로 간주 할 수 있습니다.InvokeAsync 순서 안정성

예 :

//Get Dispatcher of UI Thread 
private Dispatcher _dsp = Dispatcher.CurrentDispatcher; 

//Method called from non-UI Thread 
private void a() { 
    //Do Stuff 
    b(); 
    _dsp.InvokeAsync(() => { 
      //Do Stuff in UI Thread 
    }); 
} 

private void b() { 
    //Do stuff 
    _dsp.InvokeAsync(() => { 
     //Do stuff in UI Thread 
    }); 
} 

내가 그것이 UI 스레드의 디스패처 처음에 넣어 이후 B의 InvokeAsync의 코드는 'InvokeAsync의 코드 이전에 실행된다는 것을 당연시하거나 이런 경우 어디에 가장 시간 b의 첫 번째 실행되지만 이상한 circustances 주위에 다른 방법, 또는 더 나쁜, 두 사이의 점프 수도 있습니다?

기본적으로, 내가이 문제에 관해 어떤 문제를 일으킬 수 있습니까? 아니면이 ok nad가 내가 말한 실행 순서를 신뢰할 수 있을까요? problema에 기회가 있다면, 그것을 잘하는 방법에 대한 아이디어가 있습니까?

답변

0

비동기 작업이 실행되는 순서에 대해 어떤 가정도 할 수 없다고 생각합니다. 당신이 순서대로 실행되도록해야하는 경우,이 같은 일을 수행 할 Task 클래스를 사용할 수 있습니다 :

Task.Factory.StartNew(() => DoSomethingWith(filePath)).ContinueWith((
    Task resultFromPrevious) => DoSomethingElseWith(resultFromPrevious), 
    TaskScheduler.FromCurrentSynchronizationContext()) 

를이 경우, TaskScheduler.FromCurrentSynchronizationContext() 옵션은 UI 스레드에서 실행되는 DoSomethingElseWith 방법을 만들 것입니다.

MSDN의 Task.ContinueWith Method 페이지를 참조하십시오.

+0

filePath가 있는지는 모르지만 작업을 살펴 ​​보겠습니다. 그 정렬은 a에서 호출의 코드를 b의 호출 끝까지 복사하는 것과 같습니다. – 537mfb

+0

이 방법들에서 지역 변수를 사용할 수 있다는 것을 보여주고 있었지만 아마도 언급했을 것입니다. 아니요, 실제로는 ... 첫 번째 부분은 비동기 적으로 실행되며'TaskScheduler.FromCurrentSynchronizationContext()'옵션을 사용하면 두 번째 부분이 UI 스레드에서 실행됩니다. 이 옵션을 해제하더라도 다른 비동기 컨텍스트에서 실행되기 때문에 여전히 동일하지는 않지만 두 번째 부분은 처음 완료 될 때까지 기다릴뿐입니다. – Sheridan

+0

문제가 해결되지 않은 일부 리팩토링을 끝내지 만 리팩토링 이전에 찾던 답변입니다. - 감사합니다. – 537mfb