Windows Phone上的异步CTP - 无法脱机使用?

时间:2012-08-03 07:30:13

标签: c# windows-phone-7 async-ctp

我有这个用于阅读网络订阅源的WP7应用程序。我正在使用Async CTP下载源,在本地保存并使用它们,因此我可以离线使用App。

当我连接到wifi或手机时,一切都很好用。但是当我离线时,应用程序因错误开始崩溃:

  

远程服务器返回错误:NotFound。

调用堆栈位置:

  

AsyncCTPLibrary_Phone.dll!System.Runtime.CompilerServices.AsyncVoidMethodBulder.SetException.AnonymousMethod_2(对象   状态)

堆栈跟踪:

  

在System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback)   beginMethod,Object state)at   System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult的   asyncResult)在System.Net.WebClient.GetWebResponse(WebRequest   请求,IAsyncResult结果)at   System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult结果)   在   System.Net.Browser.ClientHttpWebRequest<> C_ DisplayClassa.b _8(对象   state2)at   System.Threading.ThreadPool.WorkItem.WaitCallback_Context(对象   System.Threading.ExecutionContext.Run(ExecutionContext。)   executionContext,ContextCallback回调,对象状态)at   System.Threading.ThreadPool.WorkItem.doWork(Object o)at   System.Threading.Timer.ring()

知道为什么吗?我不会自动降低任何东西......

编辑:这是代码的开始部分,我真的试图避免在我离线时调用Web客户端:

private void MainPage_Loaded(object sender, RoutedEventArgs e)
 {
     MainPage_Init();
 }


private async void MainPage_Init()
 {
     string isConfig = await Load_Config("");

         if (isLoaded == false)
         {
        if (RSS.Parameters.AutoUpdate == "On")
                {
                    string isDataOk = await Refresh_data(); 
                    Refresh_ui();
                }
            else
                {
                    Refresh_ui();
                }
        isLoaded = true;
         }
 }

async Task<string> Load_Config(string force)
 {
     if (!DeviceNetworkInformation.IsNetworkAvailable)
     {
         MessageBox.Show(RSS.Parameters.MessageNetwork);
         //Load Config from IsoStore
         return "No Network";
     }
     else
     {
         string data = await new WebClient().DownloadStringTaskAsync(url);
         return await GetConfig_Save_Local_XML_Async(data);
         //Load Config from Web, Save to IsoStore
     }
 }

private async Task<string> Refresh_data() //load feeds form Internet and save them to IsoStore
 {
     IsolatedStorageSettings isoStorage = IsolatedStorageSettings.ApplicationSettings;

     if (!DeviceNetworkInformation.IsNetworkAvailable)
     {
         ProgressBarSwitch("off");
         MessageBox.Show(RSS.Parameters.MessageNetwork);

     }
     else
     {
         foreach (RSSFeedInfo sfi in RSS.Parameters.FeedsInfo)
         {
        await Load_Web_XML(new Uri(sfi.Web_XML), sfi.Local_XML);
         }
         isoStorage["SettingsLastUpdate"] = System.DateTime.Now;
         isoStorage.Save();
         ProgressBarSwitch("off");
     }
     return "ok";
 }

private void Refresh_ui() //load feeds from IsoStore
 {
     //use local data
 }

2 个答案:

答案 0 :(得分:0)

您应该始终围绕网络代码try / catch。有很多可能的错误条件,其中离线只有一个。

例如,如果您连接到没有互联网的本地WiFi,IsNetworkAvailable将返回true,即使无法访问互联网。

答案 1 :(得分:0)

查看this article from MSDN,即使没有任何基础服务连接,IsNetworkAvailable也可以返回true

所以有些代码如下:

private void button1_Click(object sender, RoutedEventArgs e){
  var sb = new StringBuilder();
  sb.Append("Network available:  ");
  sb.AppendLine(DeviceNetworkInformation.IsNetworkAvailable.ToString());
  sb.Append("Cellular enabled:  ");
  sb.AppendLine(DeviceNetworkInformation.IsCellularDataEnabled.ToString());
  sb.Append("Roaming enabled:  ");
  sb.AppendLine(DeviceNetworkInformation.IsCellularDataRoamingEnabled.ToString());
  sb.Append("Wi-Fi enabled:  ");
  sb.AppendLine(DeviceNetworkInformation.IsWiFiEnabled.ToString());
  MessageBox.Show(sb.ToString());}

可以按以下方式为您提供输出:

  • 网络可用:正确
  • 启用了手机:错误
  • 已启用漫游:错误
  • 启用Wi-Fi:错误