1

RSS リーダー アプリケーションを開発しようとしており、RSS フィードをキャッシュしたいと考えています。これから行うことは、URL ロード フィードを使用して分離ストレージに XML ファイルを作成することです。これが私がこれまでに行ったことです。

// Constructor
    public MainPage()
    {
        InitializeComponent();
        using (IsolatedStorageFile isstorage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            if (isstorage.FileExists(rssCacheFile))
            {
                MessageBox.Show("Reading from cache");
                readCache(rssCacheFile);
            }
            else
            {
                MessageBox.Show("Reading from web");
                readFeed(rssLink);
            }
        }
    }

    public void readFeed(string link) 
    {
        WebClient wc = new WebClient();
        wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
        wc.OpenReadAsync(new Uri(link, UriKind.Absolute));
    }

    void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    {

        Stream rssStream = e.Result;
        XmlReader response = XmlReader.Create(rssStream);
        SyndicationFeed feeds = SyndicationFeed.Load(response);

        foreach (SyndicationItem f in feeds.Items) 
        {
            itemList.Add(new RssItem {Title = f.Title.Text });
        }

        listBox1.ItemsSource = itemList;

        //Write to the cache
        writeXML(rssStream);
    }

    public void writeXML(Stream rssStream) 
    {
        using (IsolatedStorageFile isstorage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            using (IsolatedStorageFileStream isstream = new IsolatedStorageFileStream(rssCacheFile, FileMode.Create, FileAccess.Write, isstorage))
            {
                byte[] buffer = new byte[rssStream.Length];
                while (rssStream.Read(buffer, 0, buffer.Length) > 0)
                {
                    isstream.Write(buffer, 0, buffer.Length);
                }

                isstream.Flush();
                System.Threading.Thread.Sleep(0);
            }
        }
    }

    public void readCache(string fileName) 
    {
        //IsolatedStorageFile isstorage = IsolatedStorageFile.GetUserStoreForApplication();
        using (IsolatedStorageFile isstorage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            if (isstorage.FileExists(fileName))
            {
                try
                {
                    using (isstorage)
                    {
                        IsolatedStorageFileStream stream = isstorage.OpenFile(fileName, FileMode.Open, FileAccess.Read);
                        using (StreamReader reader = new StreamReader(stream))
                        {
                            rssXml.Text = reader.ReadToEnd();
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            else 
            {
                MessageBox.Show("Cache is empty....");
            }
        }
    }

しかし、問題は、書き込まれた XML ファイルから読み取ることができないことです。ファイルの存在を確認すると、そこにあります。しかし、私はそれを読むことができません。誰でもこれの解決策を教えてもらえますか。どんな助けでも大歓迎です。ありがとう。

更新: 上記のコードを更新しましたが、エラーは発生しません。

4

1 に答える 1

0

isstorage 変数を using に配置しないでください。これは、using の最後で破棄されるためです。これは、クラス変数で必要なことではありません。また、ストリーム変数を readCache 内の using に入れて、ストリームを閉じて破棄するようにします。

また、より良いサポートを提供できるように、例外が何であるかを必ず確認してください。

于 2012-12-30T12:11:17.830 に答える