Аннулирование токена вызывает исключение. Не удалось перехватить OperationCanceledException. Я получил пользовательский необработанный - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь отменить поток HttpClient с помощью токена отмены, но я не могу обработать «OperationCanceledException». Это дает мне «пользовательское необработанное исключение». Та же самая структура хорошо работала в другом проекте в прошлом. Или есть лучший способ отменить поток HttpClient? Спасибо. Вот мой код:

private async void Start_Click(object sender, RoutedEventArgs e)
{
    await DeserializeFromStream();
}
private void Cancel_Click(object sender, RoutedEventArgs e)
{
    cts.Cancel();
}
private async Task DeserializeFromStream()
{
    cts = new CancellationTokenSource();
    CancellationToken ct = cts.Token;
    try
    {
        using (var client = new HttpClient())

        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        client.DefaultRequestHeaders.Add("APP_VERSION", "1.0.0");
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "tokentokentoken");
        using (var request = new HttpRequestMessage(HttpMethod.Get, "https://stream-fxpractice.oanda.com/v3/accounts/101-004-4455670-001/pricing/stream?instruments=EUR_USD"))
        using (var response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, ct))
        {
            var Timeout = TimeSpan.FromMilliseconds(1000);

            response.EnsureSuccessStatusCode();
            if (response.IsSuccessStatusCode) { Console.WriteLine("\n success!"); } else { Console.WriteLine((int)response.StatusCode); }

            var stream = await response.Content.ReadAsStreamAsync();
            using (StreamReader sr = new StreamReader(stream))
            using (JsonTextReader reader = new JsonTextReader(sr))
            {
                reader.SupportMultipleContent = true;
                await Task.Run(() =>
                {
                    while (reader.Read())
                    {
                        if (reader.TokenType == JsonToken.StartObject)
                        {
                            // Load each object from the stream and do something with it
                            JObject obj = JObject.Load(reader);
                            if (obj["type"].ToString() == "PRICE")
                                Dispatcher.BeginInvoke((Action)(() => { debugOutput(obj["closeoutBid"].ToString()); }));
                        }

                        ct.ThrowIfCancellationRequested();
                    }

                }, ct);
            }
        }
    }
    catch (OperationCanceledException) // includes TaskCanceledException
    {
        MessageBox.Show("Your submission was canceled.");
    }
}

1 Ответ

1 голос
/ 12 февраля 2020

Я полагаю, что вы видите "Исключение необработанного пользователя", потому что вы запускаете его в отладчике. Либо:

  • Нажмите Continue, чтобы продолжить выполнение кода, либо
  • Запустите код без отладчика.

Любой из этих параметров позволит OperationCanceledException для захвата блоком catch.

...