1

これが私のWindowsPhoneアプリケーションの問題です。
ページ2に移動できるページ1があります。ページ2OnNavigateToで非同期呼び出しを行います。
これは、アプリケーションを初めて実行するときに問題ないようです。非同期呼び出しは、新しいワーカースレッドを作成し、私のために機能します。これはすばらしいことです。
しかし、ページ1に戻ってページ2を再度呼び出すと、問題が発生することに気付きました。古いスレッドが終了していないときに、非同期呼び出しから新しいワーカースレッドが作成されました。したがって、2つのワーカースレッド間に競合があり、アプリケーションに問題が発生します。
スレッドは非同期メソッドによって暗黙的に作成されるため、スレッドを直接制御することはできません。

したがって、この場合、誰かがそれに対処する方法について提案を持っていますか、それともこの問題に対処する一般的なパターンがありますか?

4

1 に答える 1

1

非同期リクエストの発行方法によって異なります。たとえば、WebClient次のようなことを行うために、インスタンスには、イベント ハンドラーのキャンセルされたプロパティを に設定するメソッドがあるDownloadStringAsyncことがわかります。ページを離れるときに呼び出して、ハンドラーでこれをテストするだけで、うまくいくはずです。WebClientCancelAsyncCompletedtrueCancelAsync

// in some button handler or whereever
webClient.DownloadStringAsync("http://url.com")

void OnLeavePage(object sender, EventArgs e) {
  webClient.CancelAsync();
}

void OnCompleted(object sender, DownloadStringCompletedEventArgs e) {
  if (e.Cancelled) {
    return;
  }

  // do your handling
}

持っていない場合は、動作をエミュレートするプロパティを持つオブジェクトをCancelAsync渡すことができます (ハンドラーを離れてテストするときに true に設定します)。 UserStateCancelled

于 2012-07-27T18:41:14.347 に答える