2014-07-15 71 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