C # RSS-ридер с потоком, каналы записываются в listView несколько раз - PullRequest
0 голосов
/ 08 апреля 2011

У меня есть программа чтения новостей RSS, которая читает канал RSS и записывает новости со ссылками в ListView.когда я выполняю свою программу, я запускаю новую ветку, подобную этой:

    Thread myThread = new Thread(getNews);
    myThread.Start();

Мой метод чтения ленты выглядит следующим образом:

    public void getNews()
    {  
        //Creates a XmlTextReader which reads from the url entered in input field
        rssReader = new XmlTextReader(txtUrl.Text);

        //Creates an xml doc to save the content of the entered path
        rssDoc = new XmlDocument();

        //Loads the xml content from the reader into a XmlDocument
        rssDoc.Load(rssReader);

        //Make a loop to search for the <rss> tag
        for (int i = 0; i < rssDoc.ChildNodes.Count; i++)
        {
            //If the childenode is the rss tag
            if (rssDoc.ChildNodes[i].Name == "rss")
            {
                //the <rss> tag is found, and we know where it is
                nodeRss = rssDoc.ChildNodes[i];
            }
        }

        //Make a loop to search for the <channel> tag
        for (int i = 0; i < nodeRss.ChildNodes.Count; i++)
        {
            //If the childnode is the channel tag
            if (nodeRss.ChildNodes[i].Name == "channel")
            {
                //The channel tag is found and we know where it is
                nodeChannel = nodeRss.ChildNodes[i];
            }
        }

        //Make a loop to search for the <item> tag
        for (int i = 0; i < nodeChannel.ChildNodes.Count; i++)
        {
            //If the childnode is the item tag
            if (nodeChannel.ChildNodes[i].Name == "item")
            {
                //the item tag is found, and we know where it is
                nodeItem = nodeChannel.ChildNodes[i];

                //Creates a new row in the LstView which contains information from inside the nodes
                rowNews = new ListViewItem();
                rowNews.Text = nodeItem["title"].InnerText;
                rowNews.SubItems.Add(nodeItem["link"].InnerText);

                if (this.lstView.InvokeRequired)
                {
                    AddItemCallback d = new AddItemCallback(getNews);
                    this.Invoke(d);
                }
                else
                {
                    lstView.Items.Add(rowNews);
                }
            }

        }

Моя проблема заключается в том, что послеЯ начал запускать свой код в новом потоке и использовать делегата, чтобы проверить, требует ли listView вызванный, все новостные ленты записаны в моем listView несколько раз.если я запускаю метод без запуска нового потока и использования делегата, который пишется только один раз, то почему?Вероятно, это очень простой вопрос, но просто не могу понять, почему

Заранее спасибо, примеры кода приветствуются:)

Ответы [ 2 ]

0 голосов
/ 08 апреля 2011

Вы поместили свою проверку вызова в неправильном месте - таким образом, ваша функция getNews вызывается намного больше, чем вы предполагали.

в самом верху getNews попробуйте это:

if (this.lstView.InvokeRequired) {
AddItemCallback d = new AddItemCallback(getNews);
this.Invoke(d);
return;
}

Затем замените оператор if в конце на lstView.Items.Add(rowNews);

Конечно, если вы сделаете это таким образом, вы эффективно перенаправите ваш getNews в поток пользовательского интерфейса.Что вам действительно нужно, так это создать коллекцию ListViewItems и передать ее в метод Updater ... и в методе TH вы проверяете, требуется ли запуск.

0 голосов
/ 08 апреля 2011

Если требуется invoke, вы снова вызываете метод getNews. Вместо использования этого кода:

if (this.lstView.InvokeRequired)
{
     AddItemCallback d = new AddItemCallback(getNews); // STOP CALLING getNews
     this.Invoke(d);
}

Вам нужно вызвать другой метод для обновления вашего интерфейса. Это гигантская петля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...