Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 指示网络行为的最佳方式_C#_Windows Runtime_Windows Store Apps_Windows Phone 8.1_Async Await - Fatal编程技术网

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并禁用了命令(重载,加载更多)在其中