【发布时间】:2019-04-04 10:51:13
【问题描述】:
在我的项目中,导航更改的用户控件很少。其中一个控件运行任务。我是这样做的:
public partial class uc_WorkingArea : UserControl
{
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token;
public uc_WorkingArea()
{
InitializeComponent();
this.Unloaded += uc_WorkingArea_Unloaded;
token = cts.Token;
Task Printer1 = Task.Run(() => PrinterPooler(lst_PrinterStruct, 0), cts.Token);
}
private void uc_WorkingArea_Unloaded(object sender, RoutedEventArgs e)
{
cts.Cancel();
if (token.CanBeCanceled)
{
MessageBox.Show("Can be canceled");
}
if (token.IsCancellationRequested)
{
MessageBox.Show("Canceled requested");
}
cts.Cancel();
MessageBox.Show("Status: " + Printer1.Status.ToString());
}
}
当我离开当前用户控制并切换到另一个 uc_WorkingArea_Unloaded 时执行。我看到消息,可以取消该任务并接受取消请求。
但是,Printer1 任务的当前状态仍然是“IsRunning”。 所以,如果我返回到这个用户控件,任务会再次启动,并且应用程序有两个正在运行的类似任务。
我试过在Factory下运行任务,像这样
Task Printer1 = Task.Factory.StartNew(() => PrinterPooler(lst_PrinterStruct, 0), cts.Token);
但没有成功。应用仍然运行两个类似的任务。
PrinterPooler 方法不是异步的。
我不明白哪里出错了。需要你们的帮助。
【问题讨论】: