c # прервать асинхронный HttpWebRequest после тайм-аута

Я нашел здесь https://stackoverflow.com/a/19215782/4332018 хорошее решение для использования CancellationToken с async HttpWebRequest:

public static class Extensions
{
    public static async Task<HttpWebResponse> GetResponseAsync(this HttpWebRequest request, CancellationToken ct)
    {
        using (ct.Register(() => request.Abort(), useSynchronizationContext: false))
        {
            try
            {
                var response = await request.GetResponseAsync();
                return (HttpWebResponse)response;
            }
            catch (WebException ex)
            {
                // WebException is thrown when request.Abort() is called,
                // but there may be many other reasons,
                // propagate the WebException to the caller correctly
                if (ct.IsCancellationRequested)
                {
                    // the WebException will be available as Exception.InnerException
                    throw new OperationCanceledException(ex.Message, ex, ct);
                }

                // cancellation hasn't been requested, rethrow the original WebException
                throw;
            }
        }
    }
}

Но я не понимаю, как я могу прервать request, если оно выполняется дольше заданного времени.

Я знаю о CancellationTokenSource() и CancelAfter(Int32), но не понимаю, как изменить приведенный выше пример, чтобы использовать CancellationTokenSource, потому что в нем нет метода Register.

Как сделать async HttpWebRequest с возможностью отмены по истечении заданного времени?


person Denis Ross    schedule 18.09.2018    source источник
comment
Почему вы не используете свойство Timeout запроса?   -  person Mojtaba Tajik    schedule 18.09.2018
comment
@MojtabaTajik Я использую прокси и у меня проблемы с тайм-аутом использования.   -  person Denis Ross    schedule 18.09.2018


Ответы (2)


Когда вы создаете источник токена, установите отмену. Затем передайте жетон. Это должно истечь время.

CancellationTokenSource cts = new CancellationTokenSource();
                cts.CancelAfter(1000);

                var ct = cts.Token;

                var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://www.zzz.com/here");
                var test = Extensions.GetResponseAsync(httpWebRequest, ct);
person Brian Rodgers    schedule 18.09.2018

Я надеюсь, что это будет полезно для вас

 _cancelTasks = new CancellationTokenSource();
        string Response = null;
        var task = new Task(() => {

            try
            {
                using (var wb = new WebClient())
                {
                    var data = new NameValueCollection();
                    data["XMLString"] = XMLRequest;
                    var response = wb.UploadValues(ServiceURL, "POST", data);

                }
            }
            catch (Exception ex)
            {
            }
        }, _cancelTasks.Token);
        task.Start();
        if (!task.Wait(GWRequestTimeout * 1000))
        {

            _cancelTasks.Cancel();
        }
person Tahir Rehman    schedule 29.06.2019