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

C# Windows Phone上的异步CTP-无法脱机使用吗?,c#,windows-phone-7,async-ctp,C#,Windows Phone 7,Async Ctp,我有这个WP7应用程序用于阅读web提要。我使用AsyncCTP下载提要,在本地保存并使用它们,这样我就可以脱机使用应用程序了 当我连接到wifi或手机时,一切都很好。但当我脱机时,应用程序会在启动时崩溃,并出现错误: 远程服务器返回错误:NotFound 调用堆栈位置: AsyncCTPLibrary_Phone.dll!System.Runtime.CompilerServices.AsyncVoidMethodBulder.SetException.AnonymousMethod_2(对象

我有这个WP7应用程序用于阅读web提要。我使用AsyncCTP下载提要,在本地保存并使用它们,这样我就可以脱机使用应用程序了

当我连接到wifi或手机时,一切都很好。但当我脱机时,应用程序会在启动时崩溃,并出现错误:

远程服务器返回错误:NotFound

调用堆栈位置:

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

堆栈跟踪:

位于System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod,对象状态)位于 System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)在System.Net.WebClient.GetWebResponse(WebRequest)中 请求,IAsyncResult结果)位于 System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult结果) 在 System.Net.Browser.ClientHttpWebRequest.c_DisplayClassa.b_8(对象 (2)在 System.Threading.ThreadPool.WorkItem.WaitCallback\u上下文(对象 在System.Threading.ExecutionContext.Run(ExecutionContext executionContext、ContextCallback回调、对象状态)位于 位于的System.Threading.ThreadPool.WorkItem.doWork(对象o) 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
 }
private void主页\u已加载(对象发送方、路由目标方)
{
MainPage_Init();
}
私有异步void主页_Init()
{
字符串isConfig=wait Load_Config(“”);
如果(isLoaded==false)
{
如果(RSS.Parameters.AutoUpdate==“打开”)
{
字符串isDataOk=等待刷新_数据();
刷新用户界面();
}
其他的
{
刷新用户界面();
}
isLoaded=true;
}
}
异步任务加载配置(字符串强制)
{
如果(!DeviceNetworkInformation.IsNetworkAvailable)
{
Show(RSS.Parameters.MessageNetwork);
//从IsoStore加载配置
返回“无网络”;
}
其他的
{
字符串数据=等待新的WebClient()。下载StringTaskAsync(url);
返回wait wait GetConfig\u Save\u Local\u XML\u Async(数据);
//从Web加载配置,保存到IsoStore
}
}
私有异步任务Refresh_data()//从Internet加载提要并将其保存到IsoStore
{
IsolatedStorageSettings isoStorage=IsolatedStorageSettings.ApplicationSettings;
如果(!DeviceNetworkInformation.IsNetworkAvailable)
{
自动开关(“关闭”);
Show(RSS.Parameters.MessageNetwork);
}
其他的
{
foreach(RSS.Parameters.FeedsInfo中的RSSFeedInfo-sfi)
{
等待加载Web_XML(新Uri(sfi.Web_XML)、sfi.Local_XML);
}
isoStorage[“SettingsLastUpdate”]=System.DateTime.Now;
isoStorage.Save();
自动开关(“关闭”);
}
返回“ok”;
}
私有void Refresh\u ui()//从IsoStore加载提要
{
//使用本地数据
}
您应该始终对网络代码进行
尝试
/
捕获
。有很多可能的错误情况,其中脱机只是其中之一

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

查看,
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());}
可以为您提供以下方面的输出:

  • 网络可用性:正确
  • 蜂窝网络已启用:False
  • 已启用漫游:False
  • 已启用Wi-Fi:错误

您需要向我们展示使用异步的部分代码。我在post中添加了开始代码……您完全正确:)我添加了try/catch,解决了这一问题并解决了问题。