2012-11-16 50 views
0

被調用函數如何讓調用函數知道他已完成所有處理?C中的監聽器和控制流#

myFunction1(){ 

    myFunction2(); 

} 

myFunction2(DownloadStringCompletedEventHandler callback){ 

    // Calls a web service and updates local files 

} 

myFunction2Returned(object sender, DownloadStringCompletedEventArgs e){ 


} 

啓動整個調用是這樣的:

myFunction1(); 

// Continue processing here... 

現在我想知道的是,如果我叫myFunction1(),你怎麼能等待,直到一切都在myFunction2()你進行之前完成你的處理? (這就是'繼續處理......'評論之外的任何謊言)。

問題是,在我撥打myFuntion1()之後,我的代碼嘗試讀取依賴於myFunction2()的文件,以完成其Web服務調用並將所需文件完全寫入磁盤。

我希望這一切都合情合理,讓這個問題的措詞正確無誤是非常困難的。

+0

我很困惑。它不是已經爲你工作嗎? –

+0

@J。斯蒂恩 - 看看我編輯的問題。有點更詳細。 – Tiwaz89

+0

如果兩個函數在同一個線程上運行,它應該等待 – trydis

回答

2

您需要使用異步並等待。您可以編寫一個函數是這樣的:

private async void SomeFunction() 
{ 
    // Do something 
    await SomeOtherFunction(); 
    // Do something else 
} 

由於是在你的情況下,如果你沒有在其他功能的處理控制,這是對於像Web服務訪問尤其有用。這裏的關鍵字是asyncawait,這表示函數將涉及異步編程。請注意,這個語法是相對較新的(C#5),但由於您沒有在您的問題中標記任何特定版本的.NET,我想我會給你最新的和最好的;)。

+0

'async'和'await'只是糖,你應該知道它們到底發生了什麼。 – VMAtm

+0

當然你應該。 –

1

您應該使用一些任務的技術這一點,something like this

static void SimpleNestedTask() 
{ 
    var parent = Task.Factory.StartNew(() => 
    { 
     // myFunction1 code here; 
     Console.WriteLine("Outer task executing."); 

     var child = Task.Factory.StartNew((t) => 
     { 
      // myFunction2 code here 
      // Calls a web service and updates local files 
      Console.WriteLine("Nested task completing."); 
     }, TaskCreationOptions.AttachedToParent | TaskCreationOptions.LongRunning); 
    }); 

    parent.Wait(); 
    Console.WriteLine("Outer has completed."); 
}