可取消的异步Web请求

问题描述 投票:2回答:1

我正在尝试创建一种通用方法,该方法将取消异步Web请求以及与之相关的任何其他操作。我发现了与此有关的另一个问题,例如this

而且我编写了一个帮助程序类,可以完成此任务。我在下面介绍:

     public static class Helpers
    {
        public static async Task<string> GetJson(string url,
            CancellationTokenSource cancellationTokenSource,
            bool useSynchronizationContext = true)
        {
            try
            {
                var request = (HttpWebRequest)WebRequest.Create(url);
                string jsonStringResult;
                using (WebResponse response = await request.GetResponseAsync()
                    .WithCancellation(cancellationTokenSource.Token,
                    request.Abort, useSynchronizationContext))
                {
                    Stream dataStream = response.GetResponseStream();
                    StreamReader reader = new StreamReader(dataStream);
                    jsonStringResult = await reader.ReadToEndAsync();
                    reader.Close();
                    dataStream.Close();
                }

                cancellationTokenSource.Token.ThrowIfCancellationRequested();

                return jsonStringResult;
            }
            catch (Exception ex) when (ex is OperationCanceledException
                || ex is TaskCanceledException)
            {

            }
            catch (Exception ex) when (ex is WebException
                && ((WebException)ex).Status == WebExceptionStatus.RequestCanceled)
            {

            }
            catch (Exception ex)
            {
                //Any other exception
            }
            finally
            {
                cancellationTokenSource.Dispose();
            }
            return default;
        }


        public static async Task<T> WithCancellation<T>(this Task<T> task,
            CancellationToken cancellationToken, Action action,
            bool useSynchronizationContext)
        {
            using (cancellationToken.Register(action, useSynchronizationContext))
            {
                return await task;
            }
        }
    }

通知线路

cancellationTokenSource.Token.ThrowIfCancellationRequested();

返回JSON字符串之前。

当取消操作并且执行流程在线时>>

StreamReader reader = new StreamReader(dataStream);

例如,将执行下面的所有行(reader.Close()等),并且在执行ThrowIfCancelationRequested()时将引发异常-正确吗?我想念什么吗?

如果是这样,有没有一种方法可以立即取消所有内容?

感谢您的答复,

我正在尝试创建一种通用方法,该方法将取消异步Web请求以及与之相关的任何其他操作。我发现了另一个与此有关的问题。我写了一个...

c# cancellation cancellationtokensource cancellation-token
1个回答
0
投票

下面的所有行(reader.Close()等)将被执行,并且当ThrowIfCancelationRequested()为被处决-正确吗?我想念什么吗?

© www.soinside.com 2019 - 2024. All rights reserved.