在UWP应用程序(或带有UI的任何C#应用程序)中,当异步方法尚未完成但用户导航离开页面时会发生什么?我更具体的关注是,当等待完成时,异步方法将继续并修改某些UI元素,但用户已经离开了页面。
|用户输入页面
|点击按钮
|进入异步方法
|点击等待(返回处理事件)
|用户导航离开页面
|等待方法完成
| ?
此时,异步方法是否继续?如果它确实继续,并且它尝试修改UI元素,那么应用程序会因为页面不再存在而崩溃吗?
答案 0 :(得分:7)
是。异步方法将继续,您的页面将存在于内存中。您的方法可以进行修改,但显然它们是不必要的更改。您的应用不应该崩溃,除非您尝试访问不再存在的元素。例如Panel.Children[2].Opacity = 0
其中Panel
在从屏幕上卸载后现在为空。 (只是一个例子)
如果您的方法运行了很长时间,您应该使用CancellationToken
或某种类型的标志取消操作,以便您能够提早退出"例程。
答案 1 :(得分:0)
这取决于你的意思导航。如果这意味着您以简洁的方式关闭表单并因此处理所有可处理的项目,那么在您的线程的所有上下文仍保留对表单中对象的引用后,表单仍将存在于内存中。
但是,大多数System.Windows.Forms.Control
个对象在处理完毕后访问它们时会抛出异常。
示例:
private void OnButtonShowMyAsyncForm_Clicked(objece sender, Eventargs e)
{
using (var form = new MyAsyncForm(...))
{
var dlgResult = form.ShowDialog(this);
ProcessResult(dlgResult);
}
// here your form and all controls on it are disposed, but not collected yet
// if an async thread does something with any of the controls
// like enable a button, an exception is thrown.
}
因此,有一个Form.Closing事件处理程序检查是否有任何进程仍在运行,并取消关闭,或等待该进程完成,这将是更简洁。
private void OnFormClosing(object sender, CancelEventArgs e)
{
bool asyncProcessRunning = this.MyTask != null && !this.MyTaks.IsCompleted;
if (processRunning)
{
MessageBox.Show(this, "Can't close. Task still running", this.Text,
MessageBoxButton.OK,
MessageBoxIcon.Warning);
e.Cancel = true;
}
}
更简洁的方法是通知操作员并给予他
的可能性