.NET在什么条件下决定取消PLINQ任务?

时间:2018-11-21 10:40:12

标签: c# .net task-parallel-library plinq

我到处找了一些文档,所有文档似乎都建议以下内容...

  1. PLINQ任务没有默认超时
  2. PLINQ任务可能会死锁,.NET / TPL将永远不会取消它们以释放死锁

但是,在我的应用程序中,情况并非如此。我无法使用更简单的控制台应用程序复制一个最小的示例,但是我将显示我尝试过的最接近的再现,以及在完成之前被取消的实际PLINQ查询。除“任务取消例外”外,没有任何类型的openDialog: function() { if (!this.draggableDialog) { this.draggableDialog = new Dialog({ title: "Charts", type: "Message", contentWidth: "900px", contentHeight: "700px", resizable: true, content: [ new RadialMicroChart({ percentage: 75, total: 100, size: "Responsive", valueColor: "Critical" }) ], beginButton: new Button({ text: "Close", press: function() { this.draggableDialog.close(); }.bind(this) }) }); this.getView().addDependent(this.draggableDialog); } this.draggableDialog.open(); },所有这些都表明要求直接取消任务(其他Exception没有发生)。我的应用程序中的任何地方都没有取消代码,所以.NET只能决定为我取消它吗?

我知道下面的这些示例会产生Exception,这不是控制台示例显示的原因。

尝试复制,尽管运行时间很长,但此代码永远不会取消:

HttpClient

但是此代码通常在停顿之前需要等待几分钟。我不确定它是否先停顿,然后.NET注意到并取消它(但这违反了第2点...),或者.NET是否只是取消了它,因为它花费了太长时间(但这是第1点... )。 var j = 0; var ints = new List<int>(); for (int i = 0; i < 5000; i++) { ints.Add(i); }; ints.AsParallel().WithExecutionMode(ParallelExecutionMode.ForceParallelism).WithDegreeOfParallelism(8).ForAll(n => { int count = 0; while (count < 100 && j == 0) { var httpClient = new HttpClient(); var response = httpClient.GetStringAsync("https://hostname/").GetAwaiter().GetResult(); count++; Thread.Sleep(1000); } }); 在运行的代码中包含5000个元素,因此控制台测试中包含5000个元素。 usernames仅包装HttpClient并使用Papi发送SendAsync,尽管我看不出是HttpRequestMessage的原因。

SendAsync

再次在几分钟后,上述PLINQ查询将引发“任务已取消”异常,未观察到其他异常。有人曾经取消过PLINQ查询,却没有自己写取消指令,或者知道为什么会这样吗?

0 个答案:

没有答案