2014-10-27 34 views
2

我正在用xamarin構建一個android應用程序,但這個問題主要與C#有關。
在我的代碼中,我需要幾件事情發生,其中一些不需要其他部分,可以以併發方式發生。其中一些人應該等到先前的行動才能帶來成果。我以異步的方式盡我所能。目前看來,我總是在等待(以異步的方式)在下一個動作之前完成事情。等待事情,但讓事情併發運行

這裏是什麼,我試圖做一個例子:

  1. 從手機帶給用戶的圖像。
  2. 獲取最近通話的列表。
  3. 從手機獲取特定聯繫人列表。
  4. 從服務器獲取關於編號#2和#3的數據。

項目#1沒有連接到其他任何東西。我需要它與其他人同時發生。他們不需要等到它返回。當它結束時它應該更新UI。

項目#2 & #3應在併發發生。當他們結束時,他們應該更新UI

項目#4只能發生時,#2,#3結束。

我的問題是我需要什麼來滿足這種需求。我只是要求準則。

+0

啓動T1,T2和T3然後'等待T2;等待t3; T4;等待t1;'?按順序等待一系列事情將會按預期工作,因爲等待已完成的任務將立即返回,因此您始終只會「等待」最長的任務。 – 2014-10-27 13:37:32

回答

4

「並行」一詞主要用於使用多線程的CPU密集型執行。我的猜測是,你的意思是併發,這意味着異步操作同時執行而不是順序執行

這是你的async方法應該如何使用Task.WhenAll使得能夠異步等待多個任務來完成交互的簡單的佈局:

async Task Foo() 
{ 
    var t1 = First(); 
    var t2 = SecondAndThirdAndFourth(); 

    await Task.WhenAll(t1,t2); 
} 

async Task First() 
{ 
    // Bring the user image from the phone. 
    // update UI 
} 

async Task SecondAndThirdAndFourth() 
{ 
    var t2 = Second(); 
    var t3 = Third(); 

    await Task.WhenAll(t2, t3); 

    // Update UI 

    await Fourth(); 
} 

如果你的意思是並行執行,那麼你需要將工作卸載到ThreadPool線程使用Task.Run,但這隻會並行化異步方法的同步部分。


有沒有實際的理由來存儲這些任務在一個變量,它只是爲了清楚起見。在現實中,我會寫await Task.WhenAll(Second(), Third())(用適當的名字)

+1

我固定爲「併發」,你是對的(希望我在句子中正確地寫了它) – 2014-10-27 13:49:49

-1

我會做類似

var t1 = StartTask(t1); 

var t4andUIupdateAfterT2andT3 = new List[ CreateAndNotStart(t4) , CreateAndNotStart(UIUpdateAfterT2andT3) ]; 

var t2andt3 = new List [ StartTask(t1) , StartTask(t1) ]; 

t1.ContinuteWith(UpdateUI); 

t2andt3.Continuewith(t4andUIupdateAfterT2andT3) 

,你不期待任何東西