我正在尝试在一个类中具有较长的执行功能,并带有进度指示器和取消的可能性。我最终得到了这段代码
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回答之后,我禁用了“抛出时断裂”但仍然在同一点停止,请参见此图片
答案 0 :(得分:4)
这在Visual Studio中是预期的,默认情况下,当引发所有异常时它将中断。
您可以在“例外设置”窗口中控制应打破的例外。
Microsoft有关于它的一些文档here
对于您而言,如果取消选中System.OperationCanceledException(或所有公共语言运行时异常),则在引发异常时不会中断。