C# HttpClient.GetByteArrayAsync(&x2026;)&x201C;死锁”;当.NET标准库中没有internet连接时,从UWP调用

C# HttpClient.GetByteArrayAsync(&x2026;)&x201C;死锁”;当.NET标准库中没有internet连接时,从UWP调用,c#,uwp,dotnet-httpclient,.net-standard,C#,Uwp,Dotnet Httpclient,.net Standard,我正在为文档管理系统开发一个UWP应用程序。我正在尝试打开我的应用程序中的文档。当我单击打开的文档时,它将下载该文档,然后在默认应用程序中打开。但问题是,如果互联网在进程中间断开连接,文档就不会被下载。这意味着已经调用了httpClinet。我的代码如下 public async Task<DownloadFileDetail> DownloadFileAsync(int dmsFileId) { if (dmsFileId <= 0)

我正在为文档管理系统开发一个UWP应用程序。我正在尝试打开我的应用程序中的文档。当我单击打开的文档时,它将下载该文档,然后在默认应用程序中打开。但问题是,如果互联网在进程中间断开连接,文档就不会被下载。这意味着已经调用了httpClinet。我的代码如下

   public async Task<DownloadFileDetail> DownloadFileAsync(int dmsFileId)
    {
        if (dmsFileId <= 0)
        {
            throw new ArgumentException("Invalid DMS File Id");
        }
        try
        {
            return await Task.Run(async () =>
              {
                  DownloadFileDetail fileDetail = new DownloadFileDetail()
                  {
                      DocId = dmsFileId
                  };
                  string apiUrl = $"files/download/latest/{dmsFileId}";
                  HttpClient httpClient = new HttpClient();
                  httpClient.BaseAddress = new Uri(BaseApiUrl);
                  httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {SessionStore.Instance.AuthToken}");
                  var response = await httpClient.GetByteArrayAsync(apiUrl); --> gone deadlock
                  fileDetail.Content = response;
                  return fileDetail;
              });
        }
        catch (Exception ex)
        {

        }
        return new DownloadFileDetail()
        {
            DocId = dmsFileId
        };
    }
公共异步任务下载文件异步(int-dmsFileId)
{
if(dmsFileId)
{
DownloadFileDetail fileDetail=新的DownloadFileDetail()
{
DocId=dmsFileId
};
字符串APIRL=$“files/download/latest/{dmsFileId}”;
HttpClient HttpClient=新HttpClient();
httpClient.BaseAddress=新Uri(BaseApiUrl);
httpClient.DefaultRequestHeaders.Add(“Authorization”,$“Bearer{SessionStore.Instance.AuthToken}”);
var response=wait httpClient.GetByteArrayAsync(APIRL);-->gone deadlock
fileDetail.Content=响应;
返回文件详细信息;
});
}
捕获(例外情况除外)
{
}
返回新的DownloadFileDetail()
{
DocId=dmsFileId
};
}
下载过程称为UWP->.NET标准库(包含上述代码)。如果有人帮我解决这个问题就太好了

谢谢 党卫军

更新:
上面的代码在我的笔记本电脑上工作,而在开发环境中的任何其他笔记本电脑上都不工作

首先,删除
任务。运行(async()=>…)
调用:

试试看
{
DownloadFileDetail fileDetail=新的DownloadFileDetail()
{
DocId=dmsFileId
};
字符串APIRL=$“files/download/latest/{dmsFileId}”;
HttpClient HttpClient=新HttpClient();
httpClient.BaseAddress=新Uri(BaseApiUrl);
httpClient.DefaultRequestHeaders.Add(“Authorization”,$“Bearer{SessionStore.Instance.AuthToken}”);
var response=wait httpClient.GetByteArrayAsync(APIRL);-->gone deadlock
fileDetail.Content=响应;
返回文件详细信息;
}
当.NET标准库中没有internet连接时,从UWP调用

如果死锁只发生在没有internet连接的环境中,则可以在发送http请求之前检查internet是否可用。请检查这个


为什么要使用
任务。运行
API在后台线程上执行下载?另外请注意,还有一个属性。我尝试了超时,但也没有解决问题。您可以尝试添加
。ConfigureAwait(false)到两个等待语句的末尾?等待可能会阻塞UI线程,从而导致死锁。我将尝试上面的方法,具体来说,是什么让您认为这是死锁?未完成的部分与死锁不同现在,请添加您调用该方法的方式。我正在使用自定义协议从浏览器调用该方法,该协议打开我们的UWP应用程序,然后UWP开始下载文件。将该入口点设置为该UWP方法async,并等待调用DownloadFileAsync。如果您不提供更多关于周围代码的信息,我们不能帮助您。它正在处理我的笔记本电脑的任何变化,但不工作在任何其他LAPPoT。死锁开始时,互联网是在HTTPclipse的中间断开作出请求。Imeans正在等待httpClient。GetByteArrayAsync(APIRL)已经启动。上面的代码在我的一台笔记本电脑上运行,但在另一台笔记本电脑上没有运行。我在另外3台笔记本电脑上测试了它,但都失败了。它包含,当网络不可用时,您可以手动取消请求。当网络断开连接时,工作机器从HRESULT引发异常:0x80072EFE消息哪一行引发此异常
if (NetworkHelper.Instance.ConnectionInformation.IsInternetAvailable)
{
// sending the request.
}