Silverlight工作线程在完成工作后应该做什么



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

因此,在这种情况下,有人对如何处理它有建议吗?或者有没有一个共同的模式来处理这个问题?

这取决于您如何发出异步请求。如果您使用WebClient来执行类似DownloadStringAsync的操作,您将看到您的WebClient实例具有一个方法CancelAsync,该方法将把Completed事件处理程序中的cancelled属性设置为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,可以传入一个具有Cancelled属性的UserState对象来模拟行为(当您离开并在处理程序中进行测试时,将其设置为true)。

最新更新