我有一个列表,每次用户进行研究时都会加载元素...这些元素包含一个图标,它使用HttpClient对象的异步方法GetByteArrayAsync进行下载。
我有一个问题,当用户在第一个列表的图标仍在下载时进行第二个研究。因为元素列表正在更改,而图标下载正在处理第一个列表的每个元素。
所以我的猜测是,我需要取消这些请求,每次用户前往一个新的研究...我重新在Task.run和CancellationTokenSource一些stuuf,但我找不到真正有用的示例为我的情况,所以这里是我的代码...
希望你能帮助我与...谢谢你如何取消Windows Phone中的异步呼叫?
public static async Task<byte[]> DownloadElementFile(BdeskElement bdeskElement)
{
//create and send the request
DataRequest requesteur = new DataRequest();
byte[] encryptedByte = await requesteur.GetBytesAsync(dataRequestParam);
return encryptedByte;
}
public async Task<Byte[]> GetBytesAsync(DataRequestParam datarequesparam)
{
var handler = new HttpClientHandler { Credentials = new NetworkCredential(datarequesparam.AuthentificationLogin, datarequesparam.AuthentificationPassword, "bt0d0000") };
HttpClient httpClient = new HttpClient(handler);
try
{
byte[] BytesReceived = await httpClient.GetByteArrayAsync(datarequesparam.TargetUri);
if (BytesReceived.Length > 0)
{
return BytesReceived;
}
else
{
return null;
}
}
catch (WebException)
{
throw new MyException(MyExceptionsMessages.Webexception);
}
}
编辑
public async Task<Byte[]> GetBytesAsync(DataRequestParam datarequesparam)
{
var handler = new HttpClientHandler { Credentials = new NetworkCredential(datarequesparam.AuthentificationLogin, datarequesparam.AuthentificationPassword, "bt0d0000") };
HttpClient httpClient = new HttpClient(handler);
try
{
cts = new CancellationTokenSource();
HttpResponseMessage reponse = await httpClient.GetAsync(datarequesparam.TargetUri,cts.Token);
if (reponse.StatusCode == HttpStatusCode.OK)
{
byte[] BytesReceived = reponse.Content.ReadAsByteArrayAsync().Result;
if (BytesReceived.Length > 0)
{
return BytesReceived;
}
else
{
return null;
}
}
else
{
return null;
}
}
catch (WebException)
{
throw new MyException(MyExceptionsMessages.Webexception);
}
catch(OperationCanceledException)
{
throw new OperationCanceledException();
}
EDIT2 我需要取消这个funntion,当用户做一个新的研究和列表“listBoxGetDocsLibs”改变。
private async void LoadIconDocLibs()
{
foreach (var doclib in listBoxGetDocsLibs)//ERROR HERE COLLECTION HAS CHANGED
{
doclib.Icon = new BitmapImage();
try
{
byte[] Icon = await ServerFunctions.GetDocLibsIcon(doclib);
if (Icon != null)
{
{
var ms = new MemoryStream(Icon);
BitmapImage photo = new BitmapImage();
photo.DecodePixelHeight = 64;
photo.DecodePixelWidth = 92;
photo.SetSource(ms);
doclib.Icon = photo;
}
}
}
catch(OperationCanceledException)
{
}
}
}
我已经尝试o添加令牌参数,但GetByteArrayAsync不接受这种参数...(仅限字符串或Uri) –
@PaulMartinez您是对的,此方法不支持取消。必须用不同的方法或实施来完成。 – Romasz
@PaulMartinez但也许你可以使用其他支持取消的方法 - 我编辑了我的答案。 – Romasz