1

所以这是我的 Windows Phone 应用程序的问题。
我有可以导航到第 2 页的第 1 页。在第 2 页中,OnNavigateTo我进行了异步调用。
我第一次运行应用程序时这似乎没问题,异步调用创建了一个新的工作线程并为我工作,这很酷。
但我意识到,如果我回到第 1 页并重新调用第 2 页,就会出现问题:现在我有一个来自异步调用的新工作线程,而旧的工作线程没有被终止。所以两个工作线程之间存在竞争并导致我的应用程序出现问题。
我没有直接控制线程,因为它们是由异步方法隐式创建的。

所以在这种情况下,任何人都对如何处理它有建议,或者是否有处理这个问题的共同模式?

4

1 回答 1

1

这取决于您如何发出异步请求。如果你使用 say,WebClient来做类似的事情,DownloadStringAsync你会看到你的WebClient实例有一个方法CancelAsync可以将你的Completed事件处理程序中的取消属性设置为true. 离开页面时只需调用CancelAsync并在处理程序中对此进行测试,您应该会很好。

// 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您可以传入一个UserState具有模拟行为的属性的对象Cancelled(当您离开并在处理程序中测试时将其设置为 true)。

于 2012-07-27T18:41:14.347 回答