#c# #winforms #event-handling #invoke #begininvoke
#c# #winforms #обработка событий #вызвать #begininvoke
Вопрос:
Как очистить предыдущий, еще не выполненный BeginInvoke для элемента управления пользовательского интерфейса перед добавлением нового вызова begin.
В моем приложении WinForm у меня есть строка состояния, которую я часто обновляю из фонового процесса, но если я использую Invoke, я замедляю производительность фонового процесса, поэтому я хочу использовать begin invoke, но я хочу, чтобы этот статус был синхронизирован с последним BeginInvoke . Поэтому, когда я вызываю новый BeginInvoke, я хочу очистить предыдущий, еще не выполненный BeginInvoke .
Есть ли какой-нибудь способ сделать это?
Комментарии:
1. Как насчет того, чтобы просто сделать метод, который вы вызываете, используя BeginInvoke imdepotent , так что даже если вы вызовете его дважды, это не будет иметь значения, он все равно обновится до правильного значения (дважды)?
2. Нет, нет способа сделать то, о чем вы просите, могут быть обходные пути, но ничего готового
3. …или это другая проблема, чем вы думаете. Мы должны были бы увидеть код, который создает проблему.
Ответ №1:
Если вы вызываете BeginInvoke так часто, что вашему потоку пользовательского интерфейса не удается отменить вызов из очереди, вам следует рассмотреть возможность либо снижения частоты вызова BeginInvoke, либо изменения метода обновления пользовательского интерфейса (таймер?). Также согласен с комментарием Лассе.
Комментарии:
1. Спасибо, в моем проекте есть еще больше фоновых процессов, которые вызывают процесс пользовательского интерфейса, это не только обновление строки состояния. Так случается, что вызов процесса пользовательского интерфейса слишком велик, и пользовательский интерфейс начинает показывать старые значения. Я ищу что-нибудь, чтобы отменить старый вызов или просмотреть очередь вызова в процессе пользовательского интерфейса.