Windows phone 8 如何在Windows Phone中取消异步呼叫?

Windows phone 8 如何在Windows Phone中取消异步呼叫?,windows-phone-8,windows-phone,task,async-await,Windows Phone 8,Windows Phone,Task,Async Await,我有一个列表,每次用户进行研究时都会加载元素……这些元素包含一个图标,该图标由HttpClient对象的异步方法GetByteArrayAsync加载当用户在第一个列表的图标仍在下载的情况下进行第二次研究时,我遇到了一个问题。因为在图标下载处理第一个列表的每个元素时,元素列表正在更改。所以我猜,每次用户进行新的研究时,我都需要取消这些请求……我读了一些Stuf关于Task.run和CancellationTokenSource,但我找不到真正有用的示例,所以这是我的代码…希望您能帮助我…谢谢 公

我有一个列表,每次用户进行研究时都会加载元素……这些元素包含一个图标,该图标由HttpClient对象的异步方法GetByteArrayAsync加载
当用户在第一个列表的图标仍在下载的情况下进行第二次研究时,我遇到了一个问题。因为在图标下载处理第一个列表的每个元素时,元素列表正在更改。
所以我猜,每次用户进行新的研究时,我都需要取消这些请求……我读了一些Stuf关于Task.run和CancellationTokenSource,但我找不到真正有用的示例,所以这是我的代码…
希望您能帮助我…谢谢

公共静态异步任务下载元素文件(BdeskElement-BdeskElement)
{
//创建并发送请求
DataRequestEUR=新的DataRequest();
byte[]encryptedByte=等待请求者.getByteAsync(dataRequestParam);
返回加密字节;
}
公共异步任务GetByteAsync(DataRequestParam datarequesparam)
{
var handler=new-HttpClientHandler{Credentials=new-NetworkCredential(datarequesparam.authenticationlogin,datarequesparam.authenticationpassword,“bt0d0000”);
HttpClient HttpClient=新的HttpClient(处理程序);
尝试
{
byte[]BytesReceived=等待httpClient.GetByteArrayAsync(datarequesparam.TargetUri);
如果(BytesReceived.Length>0)
{
收到的返回字节数;
}
其他的
{
返回null;
}
}
捕获(WebException)
{
抛出新的MyException(MyExceptionsMessages.Webexception);
}
}

编辑

公共异步任务GetByteAsync(DataRequestParam datarequesparam) { var handler=new-HttpClientHandler{Credentials=new-NetworkCredential(datarequesparam.authenticationlogin,datarequesparam.authenticationpassword,“bt0d0000”); HttpClient HttpClient=新的HttpClient(处理程序); 尝试 { cts=新的CancellationTokenSource(); HttpResponseMessage-Response=等待httpClient.GetAsync(datarequesparam.TargetUri,cts.Token); if(response.StatusCode==HttpStatusCode.OK) { byte[]BytesReceived=reponse.Content.ReadAsByteArrayAsync().Result; 如果(BytesReceived.Length>0) { 收到的返回字节数; } 其他的 { 返回null; } } 其他的 { 返回null; } } 捕获(WebException) { 抛出新的MyException(MyExceptionsMessages.Webexception); } 捕获(操作取消异常) { 抛出新操作CanceledException(); } EDIT2 当用户进行新的研究并且列表“listBoxGetDocsLibs”发生更改时,我需要取消此功能

private async void LoadIconDocLibs()
{
foreach(listBoxGetDocsLibs中的var doclib)//此处的错误集合已更改
{
Icon=new BitmapImage();
尝试
{
byte[]Icon=wait ServerFunctions.GetDocLibsIcon(doclib);
如果(图标!=null)
{
{
var ms=新内存流(图标);
BitmapImage photo=新的BitmapImage();
photo.DecodePixelHeight=64;
photo.DecodePixelWidth=92;
照片:SetSource(ms);
doclib.Icon=photo;
}
}
}
捕获(操作取消异常)
{
}
}
}
首先需要定义:

将上面的代码放在某个地方,您可以使用按钮或其他方法访问它

不幸的是,
GetByteArrayAsync
缺少取消功能-因此不能与cts.Token一起使用,但您可以使用支持取消功能的
GetAsync
完成任务:

ctsDownload = new System.Threading.CancellationTokenSource();
HttpResponseMessage response = await httpClient.GetAsync(requestUri, cts.Token);
然后你可以从回复中获得你的内容

当您想取消任务时,它可以如下所示:

private void cancelBtn_Click(object sender, RoutedEventArgs e)
{
   if (this.cts != null)
       this.cts.Cancel();
}
public async Task<Byte[]> GetBytesAsync(DataRequestParam datarequesparam, CancellationToken ct)
{
   HttpWebRequest request = HttpWebRequest.CreateHttp(datarequesparam.TargetUri);
   request.Method = "GET";
   request.Credentials = new NetworkCredential(datarequesparam.AuthentificationLogin, datarequesparam.AuthentificationPassword, "bt0d0000");
   request.AllowReadStreamBuffering = false;

   try
   {
       if (request != null)
       {
           using (HttpWebResponse response = await request.GetResponseAsync())
           using (Stream mystr = response.GetResponseStream())
           using (MemoryStream output = new MemoryStream())
           {
               const int BUFFER_SIZE = 10 * 1024;
               byte[] buf = new byte[BUFFER_SIZE];

               int bytesread = 0;
               while ((bytesread = await mystr.ReadAsync(buf, 0, BUFFER_SIZE)) > 0)
               {
                   output.Write(buf, 0, bytesread);
                   ct.ThrowIfCancellationRequested();
               }
               return output.ToArray();
           }
       }
       else return null;
  }
  catch (WebException)
  {
      throw new MyException(MyExceptionsMessages.Webexception);
  }
}
取消任务时,将引发异常

如果您想取消自己的异步任务,可以找到一个很好的示例

编辑-您还可以构建自己的方法(例如使用HttpWebRequest),该方法将支持取消:

ctsDownload = new System.Threading.CancellationTokenSource();
HttpResponseMessage response = await httpClient.GetAsync(requestUri, cts.Token);
为此,您必须扩展HttpWebRequest(在WP下,它缺少GetResponseAsync):

//在命名空间中创建一个静态类
公共静态类扩展
{
公共静态任务GetResponseAsync(此HttpWebRequest webRequest)
{
TaskCompletionSource taskComplete=新的TaskCompletionSource();
webRequest.BeginGetResponse(
asyncResponse=>
{
尝试
{
HttpWebRequest responseRequest=(HttpWebRequest)asyncResponse.AsyncState;
HttpWebResponse someResponse=(HttpWebResponse)responseRequest.EndGetResponse(asyncResponse);
taskComplete.TrySetResult(someResponse);
}
捕获(WebException webExc)
{
HttpWebResponse failedResponse=(HttpWebResponse)webExc.Response;
任务完成。TrySetResult(失败响应);
}
catch(异常exc){taskComplete.SetException(exc);}
},webRequest);
复述
public async Task<Byte[]> GetBytesAsync(DataRequestParam datarequesparam, CancellationToken ct)
{
   HttpWebRequest request = HttpWebRequest.CreateHttp(datarequesparam.TargetUri);
   request.Method = "GET";
   request.Credentials = new NetworkCredential(datarequesparam.AuthentificationLogin, datarequesparam.AuthentificationPassword, "bt0d0000");
   request.AllowReadStreamBuffering = false;

   try
   {
       if (request != null)
       {
           using (HttpWebResponse response = await request.GetResponseAsync())
           using (Stream mystr = response.GetResponseStream())
           using (MemoryStream output = new MemoryStream())
           {
               const int BUFFER_SIZE = 10 * 1024;
               byte[] buf = new byte[BUFFER_SIZE];

               int bytesread = 0;
               while ((bytesread = await mystr.ReadAsync(buf, 0, BUFFER_SIZE)) > 0)
               {
                   output.Write(buf, 0, bytesread);
                   ct.ThrowIfCancellationRequested();
               }
               return output.ToArray();
           }
       }
       else return null;
  }
  catch (WebException)
  {
      throw new MyException(MyExceptionsMessages.Webexception);
  }
}