Не удается получить элементы в кросс-потоке ListView - PullRequest
2 голосов
/ 05 ноября 2011

Мой фоновый работник должен перебирать каждый элемент в ListView .Однако я не могу сделать это:

foreach (ListViewItem Item in List.Items)

, потому что это операция с несколькими потоками.

Я также не могу поместить элементы в ListView.ListViewItemCollection изаставить фонового работника читать из этого.Это все еще пытается получить доступ к ListView и создать операцию кросс-потока.

Как сделать элементы ListView доступными для фонового рабочего, не помещая ихв переменной где-нибудь?

Ответы [ 3 ]

5 голосов
/ 13 января 2012

Попробуйте использовать эту функцию.

private delegate ListView.ListViewItemCollection GetItems(ListView lstview);

private ListView.ListViewItemCollection getListViewItems(ListView lstview)
{
    ListView.ListViewItemCollection temp = new ListView.ListViewItemCollection(new ListView());
    if (!lstview.InvokeRequired)
    {
        foreach (ListViewItem item in lstview.Items)
        temp.Add((ListViewItem)item.Clone());
        return temp;
    }
    else
        return (ListView.ListViewItemCollection)this.Invoke(new GetItems(getListViewItems), new object[] { lstview });
}

Назовите это так:

foreach(ListViewItem item in getListViewItems(List))
1 голос
/ 08 мая 2013

Я согласен с mdb, но должен отметить, что в зависимости от важности приложения,

Control.CheckForIllegalCrossThreadCalls = false;

все еще может использоваться как временное быстрое решение.

0 голосов
/ 27 марта 2012

попробуйте это.

public Form1()
{
    InitializeComponent();

    Control.CheckForIllegalCrossThreadCalls = false;
}
...