C# HttpClient.GetAsync(…)”引用;“僵局”;当没有互联网连接时

C# HttpClient.GetAsync(…)”引用;“僵局”;当没有互联网连接时,c#,async-await,uwp,dotnet-httpclient,C#,Async Await,Uwp,Dotnet Httpclient,最近,我在使用System.Net.http.HttpClient().GetAsync(…) 当在 GETASYNC(..)< /强>的中间过程中,如果我断开了我的Internet连接,应用程序就像死锁一样,没有异常捕获,即使我等了几分钟。 下面是代码示例: 专用异步任务loadImageAsync(字符串url) { 使用(var httpClient=new httpClient()) { //当这行代码开始执行时,立即禁用internet连接 var response=wait-http

最近,我在使用System.Net.http.HttpClient().GetAsync(…)

当在<强> GETASYNC(..)< /强>的中间过程中,如果我断开了我的Internet连接,应用程序就像死锁一样,没有异常捕获,即使我等了几分钟。 下面是代码示例:

专用异步任务loadImageAsync(字符串url)
{
使用(var httpClient=new httpClient())
{
//当这行代码开始执行时,立即禁用internet连接
var response=wait-httpClient.GetAsync(url);
//一旦它被困在GetAsync(..)上,它就不会执行下面的代码
byte[]imageByte=wait response.Content.ReadAsByteArrayAsync();
WriteableBitmap位图=新的WriteableBitmap(19201080);
使用(InMemoryRandomAccessStream randomStream=new InMemoryRandomAccessStream())
{
使用(数据写入程序=新数据写入程序(随机流))
{
writer.WriteBytes(imageByte);
等待writer.StoreAsync();
等待writer.FlushAsync();
writer.DetachStream();
}
随机流搜索(0);
等待位图。设置源同步(随机流);
}
返回位图;
}
}
我曾尝试设置httpClient的超时,但如果没有internet连接,它不会关心我设置了什么

如果互联网连接断开,或者我错过了什么,有什么方法可以捕捉到吗

编辑:另一个等待loadImageAsync(..)的异步任务

公共异步任务GetImagesAsync()
{
//如果当前正在加载图像,则跳过
if(IsImageLoading){return;}
IsImageLoading=true;
ImageObjs.Clear();
尝试
{
int numberOfLoad=(int)((双精度)_LocalSettings.Values[图像加载设置的数量];
字符串区域=_LocalSettings.Values[region].ToString();
#区域获取Bing图像信息
string jsonString=wait new HttpClient().GetStringAsync($)http://www.bing.com/HPImageArchive.aspx?format=js&n={numberOfLoad}&mkt={region}”);
ImageCollection ImageCollection=JsonConvert.DeserializeObject(jsonString);
#端区
#地区下载图片
foreach(imageCollection.images中的变量i)
{
字符串url;
If(Windows .Frase.Meta)ApIdIsNo.IsTypePresent(“Windows .uI.VIEW管理.StasuBar”))
{
url=i.url.Replace(“1920x1080”、“1080x1920”);
}
其他的
{
url=i.url;
}
Add(新的ImageObj(等待loadImageAsync(bingLink+url),i.copyright,url,i.copyrightlink,region));
}
showToastNotification(_MainViewModel.ImageObjs.Count.ToString()+“已加载图像”);
#端区
}
抓住
{
//如果连接失败
}
最后
{
IsImageLoading=false;
}
}

您是否尝试过使用CancelationToken设置超时

var tokenSource = new CancellationTokenSource();
tokenSource.CancelAfter(TimeSpan.FromSeconds(15));

try
{
    var response = await httpClient.GetAsync(url, tokenSource.Token);
}
catch (TaskCanceledException ex)
{
    // handle timeout here
}

没有任何变化,仍然是相同的=(您是在调用堆栈的更高位置调用
Wait
还是
Result
?@StephenCleary我只是在问题中添加了等待loadImageAsync(..)的异步任务代码你没有调用
.Result
或类似的调用,调用堆栈中的任何位置?@StephenCleary但我确实发现了一些奇怪的事情,我从商店下载了我的应用程序(使用相同的代码逻辑),一切正常,但如果我将商店里的同一个软件包侧向加载,死锁就会发生……我在其他设备上试过,包括手机,都有相同的问题。@StephenCleary有人发帖提问,我和他有完全相同的问题。
public async Task GetImagesAsync()
{
    //skip if image is currently loading
    if (IsImageLoading) { return; }

    IsImageLoading = true;
    ImageObjs.Clear();

    try
    {
        int numberOfLoad = (int)((double)_LocalSettings.Values[NUMBER_OF_IMAGE_LOAD_SETTINGS]);
        string region = _LocalSettings.Values[REGION].ToString();

        #region Get Bing Image info
        string jsonString = await new HttpClient().GetStringAsync($"http://www.bing.com/HPImageArchive.aspx?format=js&n={numberOfLoad}&mkt={region}");
        ImageCollection imageCollection = JsonConvert.DeserializeObject<ImageCollection>(jsonString);
        #endregion

        #region Download images
        foreach (var i in imageCollection.images)
        {
            string url;

            if (Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.UI.ViewManagement.StatusBar"))
            {
                url = i.url.Replace("1920x1080", "1080x1920");
            }
            else
            {
                url = i.url;
            }

            ImageObjs.Add(new ImageObj(await loadImageAsync(bingLink + url), i.copyright, url, i.copyrightlink, region));
        }

        showToastNotification(_MainViewModel.ImageObjs.Count.ToString() + " images loaded.");
        #endregion
    }
    catch
    {
        //if connection failed
    }
    finally
    {
        IsImageLoading = false;
    }
}
var tokenSource = new CancellationTokenSource();
tokenSource.CancelAfter(TimeSpan.FromSeconds(15));

try
{
    var response = await httpClient.GetAsync(url, tokenSource.Token);
}
catch (TaskCanceledException ex)
{
    // handle timeout here
}