19

GetResponseAsync は Async/Await で cancelToken を受け付けないようです。問題は、応答から Cookie を収集する必要がある場合、以下の手順をキャンセルするにはどうすればよいかということです。

 using (HttpWebResponse response = (HttpWebResponse) await request.GetResponseAsync())
 {
    cookies.Add(response.Cookies);
 }

上記を達成するための代替コードも歓迎します。

4

2 に答える 2

8
public static async Task<T> WithCancellation<T>(this Task<T> task, CancellationToken cancellationToken, Action action, bool useSynchronizationContext = true)
{
    using (cancellationToken.Register(action, useSynchronizationContext))
    {
        try
        {
            return await task;
        }
        catch (Exception ex)
        {

            if (cancellationToken.IsCancellationRequested)
            {
                // the Exception will be available as Exception.InnerException
                throw new OperationCanceledException(ex.Message, ex, cancellationToken);
            }

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

これで、キャンセル可能な非同期メソッドでキャンセル トークンを使用できるようになりました。たとえば、WebRequest.GetResponseAsync:

var request = (HttpWebRequest)WebRequest.Create(url);

using (var response = await request.GetResponseAsync())
{
    . . .
}

となります:

var request = (HttpWebRequest)WebRequest.Create(url);

using (WebResponse response = await request.GetResponseAsync().WithCancellation(CancellationToken.None, request.Abort, true))
{
    . . .
}

例を参照してくださいhttp://pastebin.com/KauKE0rW

于 2016-10-13T20:05:46.357 に答える