Windows phone 8 等待并返回带有DownloadStringAsync WP8的结果

Windows phone 8 等待并返回带有DownloadStringAsync WP8的结果,windows-phone-8,task,webclient-download,Windows Phone 8,Task,Webclient Download,我使用DownloadStringAsync执行webrequest,但我只需要在调用DownloadStringCompleted事件时返回结果。在downloadasync方法之后,我需要等待结果,然后以字符串属性返回它。所以我实现了一个whileResult==但是我不知道在那里做什么。我已经试过Thread.sleep500了,但下载似乎一直没有完成。而代码则永远停留在中间 字符串结果=; 公共字符串QueryDataRequestParam dataRequestParam {

我使用DownloadStringAsync执行webrequest,但我只需要在调用DownloadStringCompleted事件时返回结果。在downloadasync方法之后,我需要等待结果,然后以字符串属性返回它。所以我实现了一个whileResult==但是我不知道在那里做什么。我已经试过Thread.sleep500了,但下载似乎一直没有完成。而代码则永远停留在中间

字符串结果=; 公共字符串QueryDataRequestParam dataRequestParam { 尝试 { WebClient web=新的WebClient; if!string.IsNullOrEmptydataRequestParam.AuthentificationLogin { System.Net.NetworkCredential帐户=新的NetworkCredentialdataRequestParam.AuthentificationLogin,dataRequestParam.AuthentificationPassword; web.Credentials=帐户; } web.DownloadStringCompleted+=OnDownloadStringCompleted; web.DownloadStringAsyncdataRequestParam.TargetUri; 而结果== { //我在这里该怎么办? } 返回结果; } catchWebException我们 { MessageBox.Showwe.Message; 返回null; } } 私有void OnDownloadStringCompletedobject发件人,DownloadStringCompletedEventArgs e { 如果e.错误!=null { //错误处理 } 其他的 { 结果=e.结果; } } 用户界面代码

NavigatedToNavigationEventArgs e上的受保护覆盖无效 { 基于navigatedtoe; 如果e.NavigationMode!=NavigationMode.Back { ServerFunctions.SetUserProfilUser.UserLogin、User.UserPassword; this.listBoxGetDocsLibs.Clear; 列表=新列表; 尝试 { //这里是下载的开始 ServerFunctions.GetDocLibstrue; } 捕获异常 { //错误 } 列表中的foreach BdeskDocLib docLib { this.listBoxGetDocsLibs.AdddocLib; } } } ServerFunction静态类

公共静态列表GetDocLibsbool onlyDocLibPerso { 字符串xmlContent=GetXmlURL\u GETDOCLIBS; 列表结果=BdeskDocLib.getListFromXmlContent,仅限DocLibberso; 返回结果; } 私有静态字符串GetXmlstring partialUrl { 字符串url=GenerateUrlpartialUrl; DataRequestParam DataRequestParam=新的DataRequestParam; dataRequestParam.TargetUri=新的Uriurl; dataRequestParam.UserAgent=BSynchro; dataRequestParam.AuthentificationLogin=userLogin; dataRequestParam.AuthentificationPassword=userPwd; //这里我开始查询方法 //需要查询返回字符串或任务 DataRequest requesteur=新的DataRequest; xmlResult=requesteur.QuerydataRequestParam; 如果CheckErrorConnexionxmlResult==false { 将新的例外项从登录到过期; } 返回结果; }
除非您真的需要,否则阻止主UI并没有什么好处。但是,如果您想等待结果,您可以使用async wait和-您可以找到和:

我没有尝试过这个代码,可能会有一些错误,但它应该可以工作
基于此代码,您还可以使用可等待的下载字符串版本扩展WebClient

你看到了吗?我听上去像是你的问题,是吗?是的,我已经看到了这个问题,但它对我没有帮助,因为我需要在调用DownloadStringAsync的同一个方法中返回结果:查询方法…结果将在另一个类中处理…我也尝试使用DownloadStringTaskAsync,但似乎遇到了死锁我在这里发布了一个关于它的问题问题是我需要查询方法返回我的结果,因为我在处理结果的另一个类中调用了此方法。在您的示例中,查询方法返回是无效的…@PaulMartinez您可以根据自己的意愿修改它。在我看来,此查询方法不再需要-您可以直接从您的类调用myDonload。记住这个方法是异步的,如果你想等待它,你应该执行mystring=await查询;好的,我尝试了你的代码,遇到了我在这里发布的相同问题mydownloadstring返回一个任务,其状态为等待激活。因此,在调试模式下,当mydownloadstring完成并在查询方法中返回代码时,我的应用程序的UI会弹出并保持被阻止状态。不会出现错误…@PaulMartinez你能用你的UI显示一些代码吗?你在哪里调用这些方法?你想不想阻止UI?@PaulMartinez当我看你的代码时,我认为你的GetXml,GetDocLibs也应该是异步任务-你有一个方法,里面应该等待结果。不带wait-xmlResult=requesteur.QuerydataRequestParam;将异步运行 并且该方法不会等待结果-将进一步处理,并在那里返回xmlResult。下载未完成时将返回什么?另一方面,您是否检查了从这个Uri下载字符串是否在单独的简单方法上有效?
public static Task<string> myDownloadString(DataRequestParam dataRequestParam)
{
    var tcs = new TaskCompletionSource<string>();
    var web = new WebClient();

    if (!string.IsNullOrEmpty(dataRequestParam.AuthentificationLogin))
    {
       System.Net.NetworkCredential account = new NetworkCredential(dataRequestParam.AuthentificationLogin, dataRequestParam.AuthentificationPassword);
        web.Credentials = account;
    }

    web.DownloadStringCompleted += (s, e) =>
    {
        if (e.Error != null) tcs.TrySetException(e.Error);
        else if (e.Cancelled) tcs.TrySetCanceled();
        else tcs.TrySetResult(e.Result);
    };

    web.DownloadStringAsync(dataRequestParam.TargetUri);
    return tcs.Task;
}



public async Task<string> Query(DataRequestParam dataRequestParam)
{
   string Result = "";
   try
   {
       Result = await myDownloadString(dataRequestParam);
   }
   catch (WebException we)
   {
       MessageBox.Show(we.Message);
       return null;
   }
   return Result;
}