не могу вообще понять как он работает. У меня есть пусть backgroundWorker, listView и кнопка на форме. Я жму на кнопку и запускаю backgroundWorker, который дергает функцию, в которой нужно скажем очисть listView. Вот примерное содержимое этой функции:
void F()
{
listView1.Invoke(new MethodInvoker({
listView1.Items.Clear();
}));
}
при закрытии формы в месте Invoke сообщается об эксепшене (обращение из другого потока). Как сделать правильно?
Здравствуйте, Аноним, Вы писали:
А>не могу вообще понять как он работает. У меня есть пусть 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();
}
Работает как при вызове из своего потока, так и из другого.
Здравствуйте, 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.