Выполнение многопоточного вызова ListView - PullRequest
0 голосов
/ 03 декабря 2009

У меня есть поток, работающий в фоновом режиме, который периодически пытается обновить компонент ListView, но каждый раз, когда он пытается получить «Операция с несколькими потоками недопустима: доступ к элементу управления dlList осуществляется из потока, отличного от потока, который он был создан на ". ошибка. Я использовал делегата, чтобы попытаться решить эту проблему, но это не решает проблему. Что-то не так с моим кодом? Я также пробовал Invoke вместо BeginInvoke, но та же проблема.

    delegate void updateListItemDelegate(string tag, ListViewItem lv);
    private void updateListItem(string tag, ListViewItem lv)
    {
        if (this.dlList.InvokeRequired)
        {
            this.dlList.BeginInvoke(new updateListItemDelegate(updateListItem),tag,lv);
            return;
        }
        else
        {
            int index = -1;
            foreach (ListViewItem x in dlList.Items)
            {
                if (x.Tag.ToString() == tag)
                    index = x.Index;
            }
            if (index != -1)
            {
                dlList.Items[index].SubItems[1] = lv.SubItems[1];
                dlList.Items[index].SubItems[3] = lv.SubItems[3];
            }
        }
    }

Вызывается через:

    updateListItem(x.url, x.details);

Ответы [ 2 ]

0 голосов
/ 03 декабря 2009

Ах. У меня была попытка {} catch {} в коде, регистрирующем исключение, я не понимал, что элемент ListView, который я установил в классе, также требует, чтобы делегат вызвал его, а также компонент формы. Хороший совет Фредрику!

0 голосов
/ 03 декабря 2009

Попробуйте AsyncObservableCollection из Томас Левеск .

...