Проблема межпоточного взаимодействия C # WM6 Compact Framework
-
06-07-2019 - |
Вопрос
У меня возникла проблема с обновлением элемента управления в моем пользовательском интерфейсе из потока, созданного с помощью
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);
}
}
Ваше здоровье
Один снимок