Как удалить этот вопрос? Сначала я думал, что проблема связана с DoEvents, но, как оказалось, это не так. Я разместил вопрос здесь: http://goo.gl/VpAEK с более подходящим описанием проблемы.
Спасибо - я ценю любое руководство о том, как справиться с этим...
Во-первых, я знаю этот вопрос, поскольку общая концепция задавалась ранее - у меня есть (надеюсь) конкретный вариант, о котором можно спросить. Я также начну с того, что понимаю конкретные причины не использования Application.DoEvents() и заранее заверяю всех, что мы избегаем этого, когда это возможно, и используем несколько потоков для решения проблем (без Application.DoEvents()). участие .DoEvents()) во всем нашем приложении.
При этом он является частью структуры, и я думаю, что есть определенные ситуации, в которых он имеет место.
Конкретный случай, о котором я спрашиваю, - это ситуация с одним потоком, в которой задействован исключительно пользовательский интерфейс, где (как я понимаю) по определению - это нельзя сделать в фоновом потоке. В частности, мы загружаем/настраиваем ряд элементов пользовательского интерфейса в форме, что иногда занимает 1-2 секунды, и я хочу, чтобы во время этого процесса обновлялась метка, указывающая, что происходит. В фоновом потоке действительно нет никакой тяжелой работы/работы — все это пользовательский интерфейс.
Если у меня нет вызова Application.DoEvents() после изменения текста 4 метки, метка не перерисовывается. Если кто-то может предложить альтернативу, которая решает эту проблему по-другому в чисто пользовательском интерфейсе, в среде однопотокового - я весь внимание.
Проблема в том, что время от времени в тех случаях, которые я все еще пытаюсь определить, Application.DoEvents() просто не возвращается.
Я действительно понимаю все жалобы на метод DoEvents() (большинство из которых абсолютно справедливы!!!) и различные проблемы, которые он может вызвать! Итак, в идеале, не вдаваясь в огромные дебаты о плюсах и минусах вызова DoEvents (как, кажется, почти в любой другой ветке по этой теме) - конкретный вопрос, на который я пытаюсь ответить, - может ли кто-нибудь придумать какую-либо причину почему DoEvents просто зависнет? (т.е. не вернуть)?
Если вы хотите обсудить сам вызов DoEvents(), здесь есть отличное описание его сильных и слабых сторон: http://goo.gl/4BtZf
- Наши пользователи сообщают, что это происходит не во время использования приложения, а только тогда, когда они на некоторое время отходят от своего компьютера (возможно, из-за экранной заставки?). Мы заметили это при изменении разрешения экрана во время удаленный просмотр компьютеров наших клиентов.
- У нас есть пользователи, которые настаивают на том, что это происходит чаще, когда приложение свернуто.
- У нас есть пользователи, которые настаивают на том, что это происходит чаще, когда приложение свернуто, и они выполняют некоторую работу в IE и/или Outlook.
Внутренне мы почти полностью не смогли воспроизвести его, за исключением сегодняшнего утра, когда я сделал все вышеперечисленное, в том числе отключил сетевое подключение на минуту или две и подключился к серверу через VPN на несколько минут - и все это в то время, когда наше приложение было свернуто.
После этого (буквально первый раз, когда нам удалось воспроизвести это дома) приложение зависло, а когда я подключился к процессу, оно зависло на строке Application.DoEvents(). 2-строчный метод:
label.Text = "Фу"; Приложение.DoEvents();
Многочисленные дополнительные тесты (попытки выполнить те же действия) не смогли воспроизвести проблему.
Какие-либо предложения? Спасибо.
Редактировать: Это табу, чтобы попытаться получить ответ на вопрос конкретно о DoEvents? Я относительно новичок в StackOverflow, и я просто немного смущен тем, почему я уже получил два голоса против.
Я видел, как этот вопрос задавали много раз в других темах, и (по крайней мере, на мой взгляд, почти универсальный ответ просто - не используйте application.DoEvents()). Я специально пытался быть внимательным в своем первоначальном вопросе и объяснить, почему мы использовали его в этом случае. В то же время я специально пытаюсь избежать еще одного обсуждения того, почему не следует использовать DoEvents. Если достаточное количество людей считают что-то плохой идеей, разве обсуждение этого в stackoverflow является табу? Опять же, я относительно новичок на этом форуме и пытаюсь понять правила этикета. Спасибо.
label.Invalidate()
илиlabel.Refresh()
? - person Alex Mendez   schedule 20.07.2012Application.DoEvents()
отправляет все ожидающие события своим обработчикам. Я думаю, лучшее, что вы можете сделать, это добавить как можно больше операторов ведения журнала, включить ведение журнала для нескольких ваших клиентов, а затем, когда приложение зависнет, проанализировать журналы и попытаться выяснить, какой конкретный обработчик вызывает проблему. - person Wiktor Zychla   schedule 20.07.2012