C# UWP-如果在async/await运行时离开页面,会发生什么情况?
在UWP应用程序(或任何带有UI的C#应用程序)中,当异步方法尚未完成,但用户离开页面时会发生什么?我更关心的是,当wait完成时,异步方法将继续并修改某些UI元素,但是用户已经离开了页面 |用户进入页面C# UWP-如果在async/await运行时离开页面,会发生什么情况?,c#,uwp,async-await,C#,Uwp,Async Await,在UWP应用程序(或任何带有UI的C#应用程序)中,当异步方法尚未完成,但用户离开页面时会发生什么?我更关心的是,当wait完成时,异步方法将继续并修改某些UI元素,但是用户已经离开了页面 |用户进入页面 |单击按钮 |输入异步方法 |点击等待(返回处理事件) |用户导航离开页面 |等待的方法完成 |? 此时,异步方法是否继续?如果它继续,并试图修改UI元素,应用程序是否会因为页面不再存在而崩溃?是。异步方法将继续,页面将存在于内存中。您的方法可以进行修改,但显然它们是不必要的更改。你的应用程序
|单击按钮
|输入异步方法
|点击等待(返回处理事件)
|用户导航离开页面
|等待的方法完成
|?
此时,异步方法是否继续?如果它继续,并试图修改UI元素,应用程序是否会因为页面不再存在而崩溃?是。异步方法将继续,页面将存在于内存中。您的方法可以进行修改,但显然它们是不必要的更改。你的应用程序不应该崩溃,除非你试图访问不再存在的元素。例如
Panel.Children[2].Opacity=0
其中Panel
在从屏幕卸载后现在为空。(只是一个例子)
如果您的方法运行了很长时间,您应该使用
取消令牌
或某种标志来取消操作,以允许您“提前退出”例程。这取决于您使用导航的意思。如果这意味着您以整洁的方式关闭表单,从而处理所有一次性物品,那么在线程的所有上下文仍然包含对表单中对象的引用之后,表单仍将存在于内存中
但是,大多数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;
}
}
更整洁的方法是通知操作员,让他有可能
- 重试:可能任务现在已经完成
- 忽略:不要等到任务完成,但要注意任务完成时不会出现问题
- 取消:取消关闭表单