猿问

为什么如果我尝试使用 CancellationToken.Cancel() 停止任务

我正在尝试按照我的 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 插值库

调用内部制作的库进行特定于协议的通信以等待事件(它总是被启动,所以这不是问题的根源)


宝慕林4294392
浏览 255回答 1
1回答
随时随地看视频慕课网APP
我要回答