Проблема межпоточного взаимодействия C # WM6 Compact Framework

StackOverflow https://stackoverflow.com/questions/1016946

Вопрос

У меня возникла проблема с обновлением элемента управления в моем пользовательском интерфейсе из потока, созданного с помощью

ThreadPool.QueueUserWorkItem

Внутри этого потока я вызываю

addControlToPanel(li);

Как показано здесь

private delegate void addControlToPanelDelegate(ListItem li);
private void addControlToPanel(ListItem li)
{
    if (panel1.InvokeRequired)
    {
        addControlToPanelDelegate d = new addControlToPanelDelegate(addControlToPanel);
        panel1.Invoke(d, new object[] { li });
    }
    else
    {
        panel1.Controls.Add(li);
    }
}

При первом вводе в addControlToPanel() panel1.InvokeRequired == true таким образом, создается экземпляр делегата, а затем вызывается, теперь для этой записи в addControlToPanel(), panel1.InvokeRequired == false поэтому я добавляю элемент управления на панель.

Моя проблема в том, что даже после вызова элемента управления и panel1.Значение InvokeRequired равно false, я получаю ошибку при

panel1.Controls.Add(li); 

строка, в которой указано обычное

Control.Вызов должен использоваться для взаимодействия с элементами управления, созданными в отдельном потоке.

Кто-нибудь может определить проблему?Использование invoke для доступа к элементам управления в другом потоке - это то, что я делал много раз раньше, но этот поставил меня в тупик!

ТИА

Один снимок

Это было полезно?

Решение

Похоже, проблема заключалась в передаче элемента управления при вызове (ListItem - это элемент управления формой, который я создал), вместо этого я реорганизовал код, чтобы вместо создания элемента управления и передачи его в

addControlToPanel()

метод, я передаю всю информацию, необходимую для создания элемента управления внутри метода после вызова как so

private delegate void addControlToPanelDelegate(string picname, string thumburl, PicasaEntry entry, Int32 top, EventHandler clickevent);
private void addControlToPanel(string picname, string thumburl, PicasaEntry entry, Int32 Ordinal,EventHandler clickevent)
{
    if (panel1.InvokeRequired)
    {
        addControlToPanelDelegate d = new addControlToPanelDelegate(addControlToPanel);
        this.Invoke(d, new object[] { picname, thumburl, entry, Ordinal, clickevent });
        //panel1.Invoke(d, new object[] { li });
    }
    else
    {
        ListItem li = new ListItem(picname, thumburl, entry);
        li.Top = Ordinal * li.Height;
        li.Click += clickevent;
        panel1.Controls.Add( li);
    }
}

Ваше здоровье

Один снимок

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top