C# 指示网络行为的最佳方式
我正在开发新闻客户端,在下载数据时遇到一些问题。 我有如下方法:C# 指示网络行为的最佳方式,c#,windows-runtime,windows-store-apps,windows-phone-8.1,async-await,C#,Windows Runtime,Windows Store Apps,Windows Phone 8.1,Async Await,我正在开发新闻客户端,在下载数据时遇到一些问题。 我有如下方法: public async Task LoadAsync() { var src = CurrentSource; if (src != null && !src.IsLoading) { src.IsLoading = true; var uri = new Uri(GetFeedUri);
public async Task LoadAsync()
{
var src = CurrentSource;
if (src != null && !src.IsLoading)
{
src.IsLoading = true;
var uri = new Uri(GetFeedUri);
try
{
var items = await _networkService.GetAsync<List<NewsItem>>(uri);
_dispatcherService.SafeAction(() => src.Items.AddRange(items));
await SaveSources();
src.LastUpdate = DateTime.Now;
}
catch (Exception)
{
_loggerService.LogMessage(NoInternetConnection, LoggerType.Error);
}
src.IsLoading = false;
}
}
公共异步任务LoadAsync()
{
var src=电流源;
if(src!=null&&!src.IsLoading)
{
src.IsLoading=true;
var uri=新uri(GetFeedUri);
尝试
{
var items=await\u networkService.GetAsync(uri);
_dispatcherService.SafeAction(()=>src.Items.AddRange(Items));
等待SaveSources();
src.LastUpdate=DateTime.Now;
}
捕获(例外)
{
_loggerService.LogMessage(NoInternetConnection,LoggerType.Error);
}
src.IsLoading=false;
}
}
GetAsync的实现:
public async Task<T> GetAsync<T>(Uri uri)
{
using (var http = WrappedHttpClient())
{
try
{
var cancel = new CancellationTokenSource(10000);
var response = await http.GetAsync(uri, cancel.Token);
if (response.StatusCode != HttpStatusCode.OK)
{
_eventAggregator.GetEvent<NetworkError>().Publish(true);
throw new FileNotFoundException(string.Format("No Internet connection. Code: {0}.", response.StatusCode));
}
var json = await response.Content.ReadAsStringAsync();
var result = JsonConvert.DeserializeObject<T>(json);
_eventAggregator.GetEvent<NetworkError>().Publish(false);
return result;
}
catch
{
_eventAggregator.GetEvent<NetworkError>().Publish(true);
throw new FileNotFoundException("No Internet connection.");
}
}
}
公共异步任务GetAsync(Uri)
{
使用(var http=WrappedHttpClient())
{
尝试
{
var cancel=新的CancellationTokenSource(10000);
var response=wait http.GetAsync(uri,cancel.Token);
if(response.StatusCode!=HttpStatusCode.OK)
{
_eventAggregator.GetEvent().Publish(true);
抛出新的FileNotFoundException(string.Format(“无Internet连接。代码:{0}.”,response.StatusCode));
}
var json=await response.Content.ReadAsStringAsync();
var result=JsonConvert.DeserializeObject(json);
_eventAggregator.GetEvent().Publish(false);
返回结果;
}
接住
{
_eventAggregator.GetEvent().Publish(true);
抛出新的FileNotFoundException(“无Internet连接”);
}
}
}
WrappedHttpClient只是将头添加到HttpClient
IsLoading属性绑定到视图上的ProgressBar,以指示下载和影响命令(刷新、加载更多)
大多数时候这段代码都很好用,但有时
src.IsLoading
不会切换为false,我也不知道为什么。还有别的办法解决这个问题吗?或者我不考虑一些要点?请帮忙。我觉得你粘贴的代码很好。您确定记录器实际返回并且方法完成了吗?(由于它是异步的,您甚至可能不会注意到任务是否仍在某个地方。)日志记录不是异步的。存储事件列表的是我的自定义服务。我想这个问题与网络问题有关,但您的总体方法(LoadAsync)是异步的。如果没有什么东西在等它,你就不知道它是否真的结束了。它很可能被某个返回void的事件处理程序触发,所以它是fire And forget。只需添加一些跟踪点来检查并查看发生了什么。代码中等待LoadAsync方法。问题在于这种方法。src.IsLoading将设置为true,但在某些情况下不会设置回false。因此,我将ProgressBar.IsIndeterminate设置为true并禁用了命令(重载,加载更多)代码>在其中