2009-06-19 8 views
0

У меня возникли проблемы при обновлении элемента управления на мой пользовательский интерфейс с резьбой, созданные с помощьюC# WM6 Compact Framework Cross Thread Связь Проблема

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 правда так делегат инст а затем вызывается, теперь в этой записи в addControlToPanel(), panel1.InvokeRequired == false, поэтому я добавляю элемент управления к панели.

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

panel1.Controls.Add(li); 

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

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

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

ТИА

ONESHOT

ответ

1

Кажется, проблема прохождения контроля на 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

Смежные вопросы