等待并使用DownloadStringAsync WP8返回结果

时间:2014-02-07 11:34:05

标签: windows-phone-8 task webclient-download

我使用DownloadStringAsync()进行网络请求,但我只需在调用DownloadStringCompleted事件时返回结果。在downloadasync-method之后,我需要等待结果,然后我可以在字符串属性中返回它。所以我实现了while(Result == ""),但我不知道该怎么做。我已经尝试了Thread.sleep(500),但似乎下载永远不会完成。而且代码永远存在。

  string Result = "";

    public String Query(DataRequestParam dataRequestParam)
    {    
        try
        {
            WebClient web = new WebClient();

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

            web.DownloadStringCompleted += OnDownloadStringCompleted;
            web.DownloadStringAsync(dataRequestParam.TargetUri);

            while (Result == "")
            {
                //What am i supposed to do here ?  
            }
            return Result;
        }    
        catch(WebException we)
        {
            MessageBox.Show(we.Message);
            return null;
        }
    }

    private void OnDownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        if (e.Error != null)
        {
            //Error treating
        }
        else
        {
            Result = e.Result;
        }
    }

UI代码

 
protected override void OnNavigatedTo(NavigationEventArgs e)
    {
    base.OnNavigatedTo(e);


    if (e.NavigationMode != NavigationMode.Back)
    {

    ServerFunctions.SetUserProfil(User.UserLogin,User.UserPassword);

    this.listBoxGetDocsLibs.Clear();
    List<BdeskDocLib> list = new List<BdeskDocLib>();
    try
    {
         //HERE THE START OF THE DOWNLOAD 
         ServerFunctions.GetDocLibs(true);
    }
    catch (Exception ex)
    {
       //error
    }

    foreach (BdeskDocLib docLib in list)
    {
        this.listBoxGetDocsLibs.Add(docLib);
    }

    }

}

ServerFunction静态类

public static List<BdeskDocLib> GetDocLibs(bool onlyDocLibPerso)
    {
        string xmlContent = GetXml(URL_GETDOCLIBS);
        List<BdeskDocLib> result = BdeskDocLib.GetListFromXml(xmlContent, onlyDocLibPerso);
        return result;
    }

   private static String GetXml(string partialUrl)
    {

        string url = GenerateUrl(partialUrl);

        DataRequestParam dataRequestParam = new DataRequestParam();
        dataRequestParam.TargetUri = new Uri(url);
        dataRequestParam.UserAgent = "BSynchro";

        dataRequestParam.AuthentificationLogin = userLogin;
        dataRequestParam.AuthentificationPassword = userPwd;

      //HERE I START THE QUERY method
       // NEED QUERY RETURNS A STRING or Task<String>
        DataRequest requesteur = new DataRequest();
        xmlResult=requesteur.Query(dataRequestParam);


        if (CheckErrorConnexion(xmlResult) == false)
        {
            throw new Exception("Erreur du login ou mot de passe");
        }

        return xmlResult;
    }

1 个答案:

答案 0 :(得分:0)

阻止主UI没有什么好处(除非你真的需要)。但是如果你想等待你的结果你可以使用async-await和TaskCompletitionSource - 你可以找到more about on this bloghow to use TCS in this answer

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;
}

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