C#ThrowIfCancellationRequested()无法正确捕获

时间:2019-07-04 14:47:51

标签: c#

我正在尝试在一个类中具有较长的执行功能,并带有进度指示器和取消的可能性。我最终得到了这段代码

static class Class1
{
    public static async Task<int> MyLongFunction(IProgress<int> progress, CancellationToken ct)
    {

        await Task.Run(() =>
        {

            for (int i=0; i<100; i++)
            {
                Thread.Sleep(100);

                ct.ThrowIfCancellationRequested();

                if (progress != null)
                {
                    progress.Report(i);
                }

            }

        });

        return 0;
    }

}

现在在主表单上,我得到以下结果:

void ReportProgress(int value)
{
    //Update the UI to reflect the progress value that is passed back.
    pb.Value = value;
}

private async void btnStart_Click(object sender, EventArgs e)
{
    Console.WriteLine("Started");

    var progressIndicator = new Progress<int>(ReportProgress);
    cts = new CancellationTokenSource();

    try
    {
        int test = await Class1.MyLongFunction(progressIndicator, cts.Token);
        Console.WriteLine("After long task");
    }
    catch (OperationCanceledException ex)
    {
        //Do stuff to handle cancellation
        Console.WriteLine("Lonk task cancelled: "+ex.Message);
    }

}

private void btnStop_Click(object sender, EventArgs e)
{
    cts.Cancel();
    Console.WriteLine("Task cancellation requested.");

}

代码有效,但在IDE(VS2015)中,它将始终挂在此行上

ct.ThrowIfCancellationRequested();

mscorlib.dll中发生了'System.OperationCanceledException'类型的异常,但未在用户代码中处理 附加信息:操作已取消。

但是我用try / catch块来捕捉! 如果我继续执行,确实确实是按预期的那样。

这是输出:

Started
Task cancellation requested.
Lonk task cancelled: The operation was cancelled.

那为什么IDE不再说我没有处理它?<​​/ p>

先谢谢您

已编辑 在@Chris Barber回答之后,我禁用了“抛出时断裂”但仍然在同一点停止,请参见此图片

enter image description here

1 个答案:

答案 0 :(得分:4)

这在Visual Studio中是预期的,默认情况下,当引发所有异常时它将中断。

您可以在“例外设置”窗口中控制应打破的例外。

Microsoft有关于它的一些文档here

对于您而言,如果取消选中System.OperationCanceledException(或所有公共语言运行时异常),则在引发异常时不会中断。