在Application Launching中执行异步方法

时间:2013-06-13 12:39:59

标签: windows-phone-7 asynchronous

我尝试在我的应用程序中实现登录。我需要在页面开始加载之前登录,因为当一切正常时我会转到第二页,如果不是第一页。为此,我将WMAppManifest设置为:

<DefaultTask Name="_default" NavigationPage="" />

当我执行我的异步方法时,paralel应用程序启动加载页面但它是空的,所以我的应用程序冻结。

如何查看我的Application_Launching:

private async void Application_Launching(object sender, LaunchingEventArgs e)
{
   bool logged = await LogIn("login", "pass");

   Uri nUri = null;
   if (logged)
   {
       nUri = new Uri("/SecondPage.xaml", UriKind.Relative);
   }
   else
   {
       nUri = new Uri("/FirstPage.xaml", UriKind.Relative);
   }

   ((App)Application.Current).RootFrame.Navigate(nUri);

}

异步方法LogIn:

private async Task<bool> LogIn(string login, string password)
{
    string str_login_number = login;
    string str_login_pass = password;


    JObject jo = new JObject();
    jo.Add("number", str_login_number);
    jo.Add("pass", str_login_pass);


    JsonWorker jWorker = new JsonWorker();
    var response = await jWorker.sendJSON("url", jo);
    string str_responseformjson = await jWorker.getJSON(response);

    jo = JObject.Parse(str_responseformjson);

    if (jo["response"].ToString().Equals("ok"))
    {
        return true;
    }
    else
    {
        return false;
    }

}

这是我的类JsonWorker的代码:

    class JsonWorker
    {

    public async Task<HttpWebResponse> sendJSON(string requestUrl, JObject jsonObjesct)
    {
        HttpWebRequest request = (HttpWebRequest) WebRequest.Create(requestUrl);
        request.ContentType = "text/plain; charset=utf-8";
        request.Method = "POST";

        byte[] jsonAsBytes = Encoding.UTF8.GetBytes(jsonObjesct.ToString());

        Stream x = await request.GetRequestStreamAsync();
        await x.WriteAsync(jsonAsBytes, 0, jsonAsBytes.Length);
        x.Close();

        HttpWebResponse response = (HttpWebResponse)(await request.GetResponseAsync());
        return response;
    }

    public async Task<string> getJSON(
        HttpWebResponse response)
    {
        var stream = response.GetResponseStream();
        var sr = new StreamReader(stream);
        string str_responsefromjson = await sr.ReadToEndAsync();
        sr.Close();
        stream.Close();

        return str_responsefromjson;
    }
}

请求帮助。

1 个答案:

答案 0 :(得分:0)

我在其中一个应用中有一些工作流程。我通过使用自定义UriMapper解决了这个问题。有关详细信息,请阅读此Stackoverflow answer

这是基础知识。 UriMapper根据用户是否已输入正确的登录凭据来处理要导航到的页面。如果之前已提供适当的凭据,则应用程序中的激活和启动事件将始终为“登录”。

private void Application_Launching(object sender, LaunchingEventArgs e)
{
    RootFrame.UriMapper = new LoginUriMapper();

    if (AppSettings.HasLoginInfo)
    {
        Login();
    }
}
private void Application_Activated(object sender, ActivatedEventArgs e)
{
    if (e.IsApplicationInstancePreserved == false)
    {
        // tombstoned! Need to restore state
        RootFrame.UriMapper = new LoginUriMapper();

        if (AppSettings.NotLoggedIn)
        { 
            Login();
        }
    }
}

如果登录失败,您的MainPage将处理逻辑,然后向后导航到登录页面。当您导航到登录页面时,请始终记住从导航堆栈中删除任何条目

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

    while(NavigationService.CanGoBack)
    {
        NavigationService.RemoveBackEntry();
    }
}