0

你好朋友我有一个代码如下:

for (int i = 1; i < 6; i++)
{
    int j = 0;
    Nos[j++] = Config[i];

    var xmladd = "uri to download data";
    WebClient _proxy2 = new WebClient();
    _proxy2.DownloadStringCompleted += new DownloadStringCompletedEventHandler(DownloadStringCompleted);
    _proxy2.DownloadStringAsync(new Uri(xmladd));

    string msg = Config[11] + ":" + Config[12] + " .My Current Location is " + Properties.address + " , Latitude : " + clslatlong.ReturnLat() + " , Longitude : " + clslatlong.ReturnLongi(); 
}

这里的问题是完成事件不会立即触发并继续执行进一步的代码,但我的下一个代码是基于完成事件返回的结果在这种情况下应该做什么?我的代码应该等待从完成的事件中获得响应,然后继续请帮助。

4

3 回答 3

2

如果取决于结果,您应该在请求完成处理程序中继续执行代码。这就是事件驱动或异步编码的工作方式。

于 2013-01-04T16:52:45.587 回答
1

异步编程可能会变得混乱;正确的方法是通过约翰保罗的回答:拆分你的函数并将它的一部分放在事件处理程序中。您的代码最终会变得非常混乱,因为您正在循环中执行异步操作。

您的问题有 WP7 和 WP7.1 标签;如果您可以只支持 WP7.1,那么您可以选择Microsoft.Bcl.Async库(目前处于 Beta 版)。这在 WP7.1 上启用async/ await,这更容易:

for (int i = 1; i < 6; i++)
{
  int j = 0;
  Nos[j++] = Config[i];

  var xmladd = "uri to download data";
  WebClient _proxy2 = new WebClient();
  var result = await _proxy2.DownloadStringTaskAsync(xmladd);

  ...
}
于 2013-01-04T19:14:43.143 回答
0

您可以将 Async CTP 库用于此类功能。

下载: http ://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=9983

示例:http: //10rem.net/blog/2012/05/22/using-async-and-await-in-silverlight-5-and-net-4-in-visual-studio-11-with-the-异步目标包

于 2013-01-04T17:54:57.487 回答