我需要在旧的c#项目中添加取消http请求的可能性。
该项目使用的HttpClient::GetStreamAsync似乎不支持取消令牌。
可以取消GetStreamAsync调用吗? 我还有其他什么可能性?
答案 0 :(得分:5)
由于流的工作原理,因此无法取消。我在2012年撰写的MSDN博客文章中发现了另一种解决方案。它可能对您有所帮助。作者正在使用GetStringAsync
,但该原则也适用于GetStreamAsync
。文章:Await HttpClient.GetStringAsync() and cancellation。
在MSDN文章中,作者正在使用GetAsync(...)
,其中可以获取取消参数。弥敦道问题的简单解决方案可能是这样的......
CancellationTokenSource cancellationSource = new CancellationTokenSource();
CancellationToken cancellationToken = cancellationSource.Token;
Uri uri = new Uri('some valid web address');
HttpClient client = new HttpClient();
await client.GetAsync(uri, cancellationToken);
// In another thread, you can request a cancellation.
cancellationSource.Cancel();
请注意,取消是在CancellationTokenSource
对象上进行的,不是 CancellationToken
对象。
答案 1 :(得分:0)
这是一个简单的例子。
public async Task<Stream> GetWebData(string url, CancellationToken? c = null)
{
using (var httpClient = new HttpClient())
{
var t = httpClient.GetAsync(new Uri(url), c ?? CancellationToken.None);
var r = await t;
return await r.Content.ReadAsStreamAsync();
}
}