При каких условиях .NET решает отменить задачу PLINQ? - PullRequest
0 голосов
/ 21 ноября 2018

Я осмотрел некоторую документацию, и вся документация предлагает следующее ...

  1. У задач PLINQ нет времени ожидания по умолчанию
  2. 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 без написания отмены, или вы знаете, почему это может быть?

...