C # WM6 Compact Framework Проблема связи между потоками - PullRequest
0 голосов
/ 19 июня 2009

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

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, поэтому я добавляю элемент управления на панель. 1010 *

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

panel1.Controls.Add(li); 

строка с указанием обычного

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

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

ТИА

ONESHOT

1 Ответ

1 голос
/ 19 июня 2009

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

addControlToPanel()

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

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);
    }
}

Приветствия

ONESHOT

...