C# HttpClient.GetAsync(…)”引用;“僵局”;当没有互联网连接时
最近,我在使用System.Net.http.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
当在<强> 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
}