2011-07-31 4 views
1

私は、アプリケーションが起動する前にSpashページに自動的にログインしようとしていますが、以下のコードは動作します。私はブレークポイントを入れて、それはloginDoneが呼び出されていないようです。非常に似たようなコードは、ボタンから起動するとうまく動作します。 Application_Launchingメソッドに特別なものがあります。これは、ダウンロード文字列を取得できないことを意味しますか?すべてが初期化されていない可能性がありますので、動作しませんが、エラーが予想されます。アプリの起動時にファイルをダウンロードする

private void Application_Launching(object sender, LaunchingEventArgs e) 
    { 
     done = false; 

     IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; 
     appSettings.Remove("sid"); 
     if (appSettings.Contains("username") && appSettings.Contains("password")) { 
      WebClient wc = new WebClient(); 
      wc.DownloadStringCompleted += loginDone; 
      wc.DownloadStringAsync(InkBunnyUrls.Login(appSettings["username"].ToString(), appSettings["password"].ToString())); 

      for (int i = 0; (i < 60 && !done); i++) { 
       Thread.Sleep(TimeSpan.FromSeconds(1)); 
      } 
     } 
    } 

    private void loginDone(object sender, DownloadStringCompletedEventArgs e) 
    { 
     IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; 
     XDocument loginxml = XDocument.Parse(e.Result); 
     var sid = (loginxml.Descendants("response").Elements("sid")).FirstOrDefault(); 
     if (sid == null || sid.Value.Length < 1) { 
      appSettings.Add("sid", sid.Value); 
     } 

     done = true; 

    } 

答えて

3

WebClientは1つが期待するかもしれないほど、非同期ではありません - それはDownloadStringCompleted取り扱いを含め、UIスレッド上でさまざまなことを行います。だから何をする必要があるとしても、あなたのforループで1分間ブロックしたUIスレッドを取得するのを待っています。

このようにUIスレッドを保持するのは、一般的には本当に悪い考えです。 「ファイルをダウンロード中です...」と表示されたスプラッシュ画面で起動し、UIスレッドを素早くアイドル状態にし、Webリクエストの完了などのイベントを処理できるようにします。thenファイルのダウンロードが完了したら、 "最初の画面。

関連する問題