所以这是我的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)。