Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UWP-如果在async/await运行时离开页面,会发生什么情况?_C#_Uwp_Async Await - Fatal编程技术网

C# UWP-如果在async/await运行时离开页面,会发生什么情况?

C# UWP-如果在async/await运行时离开页面,会发生什么情况?,c#,uwp,async-await,C#,Uwp,Async Await,在UWP应用程序(或任何带有UI的C#应用程序)中,当异步方法尚未完成,但用户离开页面时会发生什么?我更关心的是,当wait完成时,异步方法将继续并修改某些UI元素,但是用户已经离开了页面 |用户进入页面 |单击按钮 |输入异步方法 |点击等待(返回处理事件) |用户导航离开页面 |等待的方法完成 |? 此时,异步方法是否继续?如果它继续,并试图修改UI元素,应用程序是否会因为页面不再存在而崩溃?是。异步方法将继续,页面将存在于内存中。您的方法可以进行修改,但显然它们是不必要的更改。你的应用程序

在UWP应用程序(或任何带有UI的C#应用程序)中,当异步方法尚未完成,但用户离开页面时会发生什么?我更关心的是,当wait完成时,异步方法将继续并修改某些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;
    }
 }
更整洁的方法是通知操作员,让他有可能

  • 重试:可能任务现在已经完成
  • 忽略:不要等到任务完成,但要注意任务完成时不会出现问题
  • 取消:取消关闭表单