Varun_nayak Ответов: 1

Элементы управления WinForms UI становятся доступными только для чтения во время потоковой передачи, которая использует эти элементы управления внутри него


у меня есть один графический интерфейс, где у меня есть следующие элементы управления,
Панель инструментов, поле со списком, список, контекстное меню, ListView и Treeview.

проблема в том, что я передаю верхние элементы управления в одном потоке, который продолжает обновлять эти элементы управления.. таким образом, пока мой поток работает, я не могу нажать ни на один из элементов управления GUI.. да, я вижу обновленное значение в списке и других элементах управления, но пользователь не может нажать на какие-либо элементы управления GUI во время выполнения потока.


private void MethodXYZ()
    		{
        this.Invoke(new MethodInvoker(delegate()
                    { 
        // loigc here
            mnuItemDatabase.Enabled = false //this line shows error when I am trying to remove Invoke from Logic
        })); 
    }

ThreadStart TS1 = new ThreadStart(MethodXYZ);
                        Thread Th1 = new Thread(TS1);
                        Th1.Name = "ExecuteTestSession";
                        Th1.IsBackground = true;
                        Th1.Start();


еще одна вещь, вся функция потока, которую я написал внутри "этого.INVOKE", причина, по которой я поместил метод thread внутри Invoke, заключается в том, что я использую элементы управления UI внутри него, и его бросок ниже исключения, если я удалю Invoke,

"Недопустимая операция кросс-потока: управление "именем формы", доступ к которому осуществляется из потока, отличного от потока, в котором он был создан."

Что я уже пробовал:

я попробовал с помощью Background worker и task factory вызвать метод thread.

Ralf Meier

Все части графического интерфейса принадлежат основному потоку и могут быть доступны, актуализированы и аннулированы только оттуда.
Правильный способ-это вызов, но ваш поток должен дать основному потоку время для работы. Так... каков код вашего потока ? У тебя была нить?Спать в нем ?

Varun_nayak

Мой метод, который находится в потоке, не имеет никакого кода сна,
В нем тысячи строк.. Иногда даже Лакс.. Запуск внутри цикла for, обновление списка GUI шаг за шагом со значениями, полученными из базы данных.
И я пытаюсь дать доступ к опции "пауза" пользователю между тем, но мой графический интерфейс получил замораживание. таким образом, пользователь может просто увидеть окно списка обновлений, но не может нажать на кнопку паузы.

1 Ответов

Рейтинг:
0

Richard Deeming

Похоже, вы запускаете фоновый поток, который просто вызывает Invoke Это толкает всю логику обратно в поток пользовательского интерфейса, как если бы вы никогда не запускали фоновый поток в первую очередь. Единственная разница в том, что теперь у вас есть второй поток, застрявший в ожидании завершения логики.

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

Итак, вместо:

this.Invoke(new MethodInvoker(delegate{
    // Read UI
    // Logic
    // Update UI
    // More logic
    ...
});

использовать:
this.Invoke(new MethodInvoker(delegate{
    // Read UI
});

// Logic here

this.Invoke(new MethodInvoker(delegate{
    // Update UI
});

// More logic
...