我到处找了一些文档,所有文档似乎都建议以下内容...
但是,在我的应用程序中,情况并非如此。我无法使用更简单的控制台应用程序复制一个最小的示例,但是我将显示我尝试过的最接近的再现,以及在完成之前被取消的实际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查询,却没有自己写取消指令,或者知道为什么会这样吗?