我正在尝试创建一种通用方法,该方法将取消异步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请求以及与之相关的任何其他操作。我发现了另一个与此有关的问题。我写了一个...
下面的所有行(reader.Close()等)将被执行,并且当ThrowIfCancelationRequested()为被处决-正确吗?我想念什么吗?