我正在尝试按照我的 MSDN 提供的示例在 C# 中实现任务取消。我有一个带有图形的 Windows 窗体应用程序,显示来自外部设备的数据和一个开始/停止按钮。这或多或少是按钮内的代码:
if (drawGraph_task == null)
{
cts = new System.Threading.CancellationTokenSource();
token = cts.Token;
drawGraph_task = new Task(() =>
{
this.Invoke(new InvokeDelegate(this.myChart.Series[0].Points.Clear));
while (true)
{
// get x and y from device using external lib
this.Invoke(new addPointXYDelegate(this.myChart.Series[0].Points.AddXY), new object[] { x, y });
this.Invoke(new InvokeDelegate(this.chart_pressure.Update)); // update graph
if (token.IsCancellationRequested)
{
return;
}
}
}, token);
this.button_main_start.Text = "Stop";
drawGraph_task.Start();
}
else
{
cts.Cancel();
try
{
drawGraph_task.Wait();
}
catch (AggregateException ae)
{
// do nothing
}
finally
{
cts.Dispose();
drawGraph_task.Dispose();
drawGraph_task = null;
this.button_main_start.Text = "Restart";
}
}
为什么代码仍然停留在 drawGraph_task.Wait() 调用中?我试图在任务中使用 token.throwIfCancellationRequested() ,但有时我有同样的效果,有时我的捕获没有捕获异常。我究竟做错了什么?为完整起见,x 和 y 的计算涉及:
MathNet 插值库
调用内部制作的库进行特定于协议的通信以等待事件(它总是被启动,所以这不是问题的根源)
相关分类