Я осмотрел некоторую документацию, и вся документация предлагает следующее ...
- У задач PLINQ нет времени ожидания по умолчанию
- PLINQзадачи могут зайти в тупик, и .NET / TPL никогда не отменит их, чтобы вы освободили тупик
Однако в моем приложении это не так.Я не могу воспроизвести минимальный пример, используя более простое консольное приложение, но покажу наиболее близкое воспроизведение, которое я пробовал, и фактический запрос PLINQ, который отменяется до завершения.Не существует Exception
какого-либо другого типа, кроме исключений отмены задач, которые все предполагают, что задание было запрошено для отмены напрямую (никаких других Exception
нигде не происходило).В моем приложении нет кода отмены, поэтому может быть только .NET, решивший отменить его для меня?
Я знаю, что приведенные ниже примеры выбивают HttpClient
s, это не причина,как показывает пример консоли.
Попытка воспроизведения, этот код никогда не отменяется, несмотря на эпическое время выполнения:
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);
}
});
Но этот код, как правило, включается за пару минут до остановки.Я не уверен, что сначала он останавливается, а затем .NET замечает это и отменяет его (но это нарушает пункт 2 ...), или же .NET просто отменяет его, потому что это заняло слишком много времени (но это пункт 1 ...).usernames
содержит 5000 элементов в исполняемом коде, следовательно, консольный тест с 5000 элементами.Papi
просто оборачивает HttpClient и использует SendAsync
для отправки HttpRequestMessage
, я не вижу, хотя SendAsync
является причиной.
importSuccess = usernames.AsParallel().WithExecutionMode(ParallelExecutionMode.ForceParallelism).WithDegreeOfParallelism(8).All(u => {
var apiClone = new Papi(api.Path);
apiClone.SessionId = api.SessionId;
var userDetails = String.Format("stuff {0}", u);
var importResponse = apiClone.Post().WithString(userDetails, "application/json").Send(apiClone.SessionId).GetAwaiter().GetResult();
if (importResponse.IsSuccessStatusCode) {
var body = importResponse.Content.ReadAsStringAsync().GetAwaiter().GetResult().ToLower();
if (body == "true") {
return true;
}
}
return false;
});
Снова приведенный выше запрос PLINQ генерирует исключение отмененной задачичерез пару минут никаких других исключений не наблюдается.У кого-нибудь когда-либо был отменен запрос PLINQ без написания отмены, или вы знаете, почему это может быть?