在应用程序启动中执行async方法



我尝试在我的应用程序中实现登录。我需要登录页面开始加载之前,因为当一切都好我去第二页,如果不是第一页。为此,我这样设置WMAppManifest:

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

当我执行async方法时,并行应用程序开始加载页面,但它是空的,所以我的应用程序冻结。

如何看我的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);
}

async方法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;
    }
}

请帮助。

我有一些工作流程在我的一个应用程序。我通过使用自定义UriMapper解决了这个问题。阅读这个Stackoverflow回答以获得更多信息。

这是基本的。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();
    }
}

最新更新