2016-05-31 54 views
0

我有以下方法,在Windows的存储项目,上传文件取消的HttpClient上的连接请求失去了

public async Task<Boolean> UploadFileStreamService(Stream binaries, String fileName, String filePath) 
    { 

     try 
     { 
      filePath = Uri.EscapeDataString(filePath); 

      using (var httpClient = new HttpClient { BaseAddress = Constants.baseAddress }) 
      { 

       var content = new StreamContent(binaries); 
       httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", App.Current.Resources["token"] as string); 
       App.Current.Resources["TaskUpload"] = true; 
       using (var response = await httpClient.PostAsync("file?fileName=" + filePath, content)) 
       { 

        string responseData = await response.Content.ReadAsStringAsync(); 
        if (responseData.Contains("errorCode")) 
         throw new Exception("Exception: " + responseData); 

        else 
        { 
         JsonObject jObj = new JsonObject(); 
         JsonObject.TryParse(responseData, out jObj); 
         if (jObj.ContainsKey("fileId")) 
         { 
          if (jObj["fileId"].ValueType != JsonValueType.Null) 
          { 
           App.Current.Resources["NewVersionDoc"] = jObj["fileId"].GetString(); 
          } 
         } 

        } 
        return true; 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      ... 
     } 
    } 

而且在app.xaml.cs我对构造:

NetworkInformation.NetworkStatusChanged += 
     NetworkInformation_NetworkStatusChanged; // Listen to connectivity changes 

并在该方法我检查连接更改。

我想知道的是当我检测到网络变化(从互联网到没有)时如何停止上传任务。

回答

1

您可以使用取消令牌。您需要CancellationTokenSource

private readonly CancellationTokenSource _cts = new CancellationTokenSource(); 

然后令牌传递到您的UploadFileStreamService方法(使用_cts.Token获得令牌):

public async Task<Boolean> UploadFileStreamService(Stream binaries, String fileName, String filePath, CancellationToken ct) 

和使用PostAsync另一个重载,它接受令牌(注 - 还用接受过载所有其他异步方法的令牌,例如对于ReadAsStringAsync):

using (var response = await httpClient.PostAsync("file?fileName=" + filePath, content, ct)) 

然后,当你发现网络连接中断,与取消:

_cts.Cancel(); 

注意,这将引发OperationCancelledException上PostAsync电话,你可能(或可能不会)希望以某种方式处理。

+0

是的,那工作:)谢谢 – Ric

+0

只是一个后续问题,如果我在几个PostAsync上使用相同的标记,当我做_cts.Cancel();它是否取消使用该令牌的所有任务? – Ric

+0

是(如果您使用来自同一个CancellationTokeSource的令牌 - 它们不必相同)。所以如果你想单独取消每个帖子 - 使用不同的CancellationTokenSources。 – Evk