2014-07-15 120 views
1

我不得不爲.NET客戶端項目使用.NET 3.5。通常我會使用.NET 4.5並使用Async/Await,但是我不能在這個項目中使用4.5。異步請求.NET 3.5

我不確定我的解決方案是否正確,但看起來很簡單。基本上下面的方法將異步下載文件,並返回一個布爾值來表示成功或不成功。但在主代碼中,我不確定如何在繼續執行下一行代碼之前等待方法的響應。

private bool DownloadJSONFile(string url) 
    { 
     bool responseStatus = false; 

     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 

     request.BeginGetResponse(result => { 
      using (HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result)) 
      { 
       if(response.StatusCode == HttpStatusCode.OK) 
       { 
        responseStatus = true; 
       } 
      } 
     }, null); 

     return responseStatus; 
    } 

這裏是主函數調用DownloadJSONFile

private void Form1_Load(object sender, EventArgs e) 
{ 
     bool a = DownloadJSONFile("http://myserver.com/clients.json"); 
     MessageBox.Show("Download complete"); 
} 

在消息框中顯示的是請求完成之前的時刻。我理解的是完全正常的。

怎麼可能等到DownloadJSONFile完成?

回答

2

你可以把它稱之爲當它完成

request.BeginGetResponse(result => { 
    using (HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result)) 
    { 
     if(response.StatusCode == HttpStatusCode.OK) 
     { 
      responseStatus = true; 
      DoSomething(); 

     } 
    } 
}, null); 

然後添加這個地方

private void DoSomething() 
{ 
    MessageBox.Show("Done!"); 
} 

否則另一種方法,你可以看看的.Net 3.5 AsyncBridge:https://www.nuget.org/packages/AsyncBridge.Net35

+0

這個問題我與它一起調用其他方法是,隨着代碼開始增長,最終會在一個完成時調用彼此的長鏈方法中結束。我會看看Async Bridge。謝謝。 –

+0

我能想到的唯一有點實用的方法是創建一個類,當它完成時觸發一個事件。然後,您可以在適當的時間添加事件處理程序。 – Cory