如何解决如何从导航列表中删除页面并终止该页面的所有过程?
在其中一种情况下,我需要从现有页面导航回去,并希望确保该页面的所有正在运行的进程都终止。
使用导航PopAsync
和RemovePage
方法,它只是删除页面而不终止任何进程。我知道CancellationToken
可能有用,但是不确定用户当前正在运行哪个进程,我不认为在每个按钮上都写CancellationToken应该是一个好方法。
有什么解决方案可以导航并终止该页面的所有正在运行的进程吗?
假设我有15个按钮来完成某些任务,例如,让我们考虑下面的代码:
async void Button1_Clicked(System.Object sender,System.EventArgs e)
{
for (int i = 0; i < 1000; i++)
{
await Task.Delay(1000);
Debug.WriteLine("Count:" + i);
}
}
async void Button2_Clicked(System.Object sender,System.EventArgs e)
{
for (int i = 0; i < 1000; i++)
{
await Task.Delay(1000);
Debug.WriteLine("Count:" + i);
}
}
async void Button3_Clicked(System.Object sender,System.EventArgs e)
{
for (int i = 0; i < 1000; i++)
{
await Task.Delay(1000);
Debug.WriteLine("Count:" + i);
}
}
以此类推...
现在,在上面的示例中,每当用户单击任何按钮时,它将开始打印计数,现在,一旦用户导航回到上一页,它仍将打印计数。我们如何避免这种情况并停止所有进程?
解决方法
调用PopAsync
和RemovePage
方法时,有一个OnDisappearing
方法可用于关闭该页面的所有进程。
public partial class PageMain : ContentPage
{
public PageMain()
{
InitializeComponent();
}
protected override void OnDisappearing()
{
base.OnDisappearing();
// Destroying threads
Thread.Abort
}
}
但是,需要从创建手动销毁进程开始对其进行手动管理。更多 Destroying threads 信息可以参考此文档。
==================================更新============ ======================
从共享的示例代码中,这是如何取消Task
的示例:
async void Button1_Clicked(System.Object sender,System.EventArgs e)
{
tokenSource1 = new CancellationTokenSource();
CancellationToken ct = tokenSource1.Token;
var task = Task.Run(() =>
{
// Were we already canceled?
ct.ThrowIfCancellationRequested();
bool moreToDo = true;
while (moreToDo)
{
// Poll on this property if you have to do
// other cleanup before throwing.
if (ct.IsCancellationRequested)
{
// Clean up here,then...
ct.ThrowIfCancellationRequested();
}
}
},tokenSource1.Token); // Pass same token to Task.Run.
}
...
protected override void OnDisappearing()
{
base.OnDisappearing();
tokenSource1.Cancel();
tokenSource2.Cancel();
tokenSource3.Cancel();
}
以上代码使用 CancellationTokenSource 手动取消了Task
。
还可以参考 Cancel a list of tasks 来更智能地取消它们。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。