gpt4 book ai didi

c# - 发生类型为 'System.OperationCanceledException' 的异常

转载 作者:太空狗 更新时间:2023-10-30 00:26:01 29 4
gpt4 key购买 nike

我正在实现一个 Parallel.ForEach 循环来做一些工作,但由于未处理的异常,我遇到了一个问题,而我认为我处理了取消。

为了尝试解决问题,我在 winform 中做了一个简单的测试设置。它有一个开始按钮、一个取消按钮和一个输出标签。

代码:

public partial class Form1 : Form
{
CancellationTokenSource cts = new CancellationTokenSource();

public Form1()
{
InitializeComponent();
}

private async void button1_Click(object sender, EventArgs e)
{
output.Text = "Running";

try
{
var runTask = Task<string>.Factory.StartNew(() => Run());
await runTask;
this.output.Text = runTask.Result;
}
catch(Exception ex)
{
throw ex;
}
}

private string Run()
{
int useThreads = Environment.ProcessorCount - 2 < 1 ? 1 : Environment.ProcessorCount - 2;

ParallelOptions options = new ParallelOptions() { MaxDegreeOfParallelism = useThreads, CancellationToken = cts.Token };

options.CancellationToken.Register(() => ActionOnCancel());

List<int> somelist =new List<int>();

for(int i = 0; i < 100; i++)
somelist.Add(i);

Parallel.ForEach(somelist, options, (row, loopstate) =>
{
if(loopstate.ShouldExitCurrentIteration || loopstate.IsExceptional)
loopstate.Stop();

Thread.Sleep(1000);

});

return "Done";
}

private void ActionOnCancel()
{
output.Text= "Cancelled";
}

private void button2_Click(object sender, EventArgs e)
{
cts.Cancel();
}

当我运行程序并点击取消按钮(以触发 button2_Click)时,我不断收到此错误:

An exception of type 'System.OperationCanceledException' occurred in mscorlib.dll but was not handled in user code

Additional information: The operation was canceled.

If there is a handler for this exception, the program may be safely continued.

调试器突出显示 Parallel.ForEach 部分。但为什么???我以为我通过 CancellationToken 正确处理了取消。

ex 中的异常消息没有给我任何清晰的信息:“{“操作被取消。”}” 呃...是的...这就是意图...

我忽略了什么?问候,

马蒂斯

最佳答案

总是抛出这个异常。如果在 CancellationTokenSource 上调用了取消方法,则在访问并行任务时必须处理 OperationCanceledException。

try
{
Parallel.ForEach(somelist, options, (row, loopstate) =>
{
if(loopstate.ShouldExitCurrentIteration || loopstate.IsExceptional)
loopstate.Stop();

Thread.Sleep(1000);

});
}
catch (OperationCanceledException)
{
// Handle the cancelled Task
}

关于c# - 发生类型为 'System.OperationCanceledException' 的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13881699/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com