как правильно использовать Invoke
От: Аноним  
Дата: 09.02.11 23:51
Оценка:
не могу вообще понять как он работает. У меня есть пусть backgroundWorker, listView и кнопка на форме. Я жму на кнопку и запускаю backgroundWorker, который дергает функцию, в которой нужно скажем очисть listView. Вот примерное содержимое этой функции:


void F()
{
listView1.Invoke(new MethodInvoker({
listView1.Items.Clear();
}));
}


при закрытии формы в месте Invoke сообщается об эксепшене (обращение из другого потока). Как сделать правильно?
Re: как правильно использовать Invoke
От: AlexGin Беларусь  
Дата: 11.02.11 12:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>не могу вообще понять как он работает. У меня есть пусть backgroundWorker, listView и кнопка на форме. Я жму на кнопку и запускаю backgroundWorker, который дергает функцию, в которой нужно скажем очисть listView. Вот примерное содержимое этой функции:



А>
А>void F()
А>{
А>listView1.Invoke(new MethodInvoker({
А>listView1.Items.Clear();
А>}));
А>}  
А>


А>при закрытии формы в месте Invoke сообщается об эксепшене (обращение из другого потока). Как сделать правильно?


Обычно в классе-наследнике делаю так:
public class MyListView : ListView
{

  public Clear()
  {
    if (this.InvokeRequired)
    {
      this.Invoke(new MethodInvoker(delegate
      {
        Items.Clear();
      }));
    }
    else
      Items.Clear();
}

Работает как при вызове из своего потока, так и из другого.
Re[2]: как правильно использовать Invoke
От: AlexGin Беларусь  
Дата: 11.02.11 12:40
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>Здравствуйте, Аноним, Вы писали:


А>>не могу вообще понять как он работает. У меня есть пусть backgroundWorker, listView и кнопка на форме. Я жму на кнопку и запускаю backgroundWorker, который дергает функцию, в которой нужно скажем очисть listView. Вот примерное содержимое этой функции:



А>>
А>>void F()
А>>{
А>>listView1.Invoke(new MethodInvoker({
А>>listView1.Items.Clear();
А>>}));
А>>}  
А>>


А>>при закрытии формы в месте Invoke сообщается об эксепшене (обращение из другого потока). Как сделать правильно?


AG>Обычно в классе-наследнике делаю так:

AG>
AG>public class MyListView : ListView
AG>{

AG>  public Clear()
AG>  {
AG>    if (this.InvokeRequired)
AG>    {
AG>      this.Invoke(new MethodInvoker(delegate
AG>      {
AG>        Items.Clear();
AG>      }));
AG>    }
AG>    else
AG>      Items.Clear();
AG>}
AG>

AG>Работает как при вызове из своего потока, так и из другого.
Можно и не без наследования — просто вызвать InvokeRequired и проверить — требуется ли работать через Invoke.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.