2013-10-11 69 views
0

我有一個關於invokeAsync和羯羊的CAL命令可被視爲可靠的ornot問題。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 
    }); 
} 

我可以理所當然地認爲,在b的InvokeAsync的代碼將在」 InvokeAsync代碼之前,因爲它放在UI線程的調度先跑到或者這是一個情況下最的時間b會先跑,但是在奇怪的賽道上,它可能是相反的,或者更糟的是,在兩者之間跳躍?

基本上,我可以有這個2調用麻煩在某些時候,或者這是正常的NAD將可靠地追隨我所提到的執行順序?如果有問題的機會,關於如何使它變好的任何想法?

回答

0

我不相信你可以做出的順序,任何異步操作運行任何假設。但是,如果你需要他們按順序運行,您可以使用Task類做這樣的事情:

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

在這種情況下,TaskScheduler.FromCurrentSynchronizationContext()選項將使DoSomethingElseWith方法在UI線程上運行。

你可能想看看Task.ContinueWith Method頁面上MSDN。

+0

不知道你的文件路徑是什麼有,但會看任務 - 那種是一樣的複製從調用代碼中在B中調用的到底有沒有? – 537mfb

+0

它只是向您顯示您可以在這些方法中使用局部變量,但我可能應該提到這一點。不,不是......第一部分將異步運行,使用'TaskScheduler.FromCurrentSynchronizationContext()'選項將使第二部分在UI線程上運行。即使你關閉了這個選項,它仍然不一樣,因爲它們會運行在不同的異步環境中,但第二部分只是等待第一個完成。 – Sheridan

+0

我最終做了一些重構,但沒有解決這個問題,但這是我在重構之前尋找的答案 - 謝謝 – 537mfb