.проблема чистой заморозить приложения WinForms
Ладно, у меня есть проблема, и я не жду ответа сразу. Мне нужна помощь, подбрасывание идей, если у кого-то найдется свободное время. Я нахожу, что разговоры о таких вещах могут помочь быстрее прийти к решению, но я застрял на том, чтобы с кем-то поговорить об этом!
У меня есть программа .Net 2.0 Winforms, которая работает на компьютерах людей. Он появляется в виде небольшой формы, например, в правом нижнем углу их монитора, направляя их на то, что делать дальше, своего рода способом оценки типа. Он работает постоянно, отслеживая их нажатия клавиш и щелчки мыши. Затем он сравнивает то, что они только что сделали, с набором вещей, которые они должны сделать, и если они делают это правильно, то они получают оценку за этот конкретный шаг, и программа переходит к следующему шагу, чтобы сравнить то, что вы делаете.
Все прекрасно работает для многих людей. Однако для одной компании, которая его использует, программа зависает.
Я ввел некоторые отладочные журналы в текстовый файл, чтобы видеть, какие функции вызываются и когда, любые исключения, которые могут возникнуть. Это не имеет никакой закономерности, когда происходит замораживание.
Я проверил журналы событий Windows, которые просто говорят мне, что программа замерла. Я проверил, какие программы у них работают в фоновом режиме и какие ресурсы доступны на компьютере во время его работы.
Я пробовал воспроизвести на своей машине и не могу.
Итак, очевидно, Вы читаете это и думаете: "чем, черт возьми, я могу вам помочь?" Ну, скажите мне, что вы могли бы искать или как вы могли бы подойти к этому. Здесь слишком много кода, чтобы размещать его здесь, так как я не могу точно определить конкретную область. Может быть, есть инструмент, который можно запустить на их компьютере, например, они не будут возражать, если я сделаю это с удаленного сеанса.
Существует несколько потоков, происходящих, и мьютексы используются на этом пути. Вполне возможно, что один из них заперт и не отпущен. Я обновил код, чтобы попытаться убедиться, что это уже не произойдет.
Я ценю, что это не вопрос типа "как мне заказать дату и время в DataGridView", но любые идеи будут наиболее ценны.
Джулиан
Что я уже пробовал:
Подробный журнал отладки в текстовый файл
Проверил Журналы Событий Windows
Обновленный код в возможной проблемной области
Проверил фоновые ресурсы + антивирусные журналы - безрезультатно
Kornfeld Eliyahu Peter
Есть ли у вас какие-то причины в четном журнале для замораживания?
У вас есть только один экземпляр вашего приложения?
Сколько у вас мьютексов?
jugs0101
Привет Корнфельд,
Спасибо, что откликнулись! В ответ на ваши вопросы:
1. в моем собственном журнале событий (to file) или журнале событий Windows нет никаких указаний на замораживание. Windows просто указывает, что программа замерзла (боюсь, у меня нет точного текста передо мной).
2. Да, существует только один экземпляр запущенной программы. Я подтвердил это, фактически наблюдая, как клиент повторяет проблему на встрече GoTo.
3. я считаю, что существует 2 отдельных случая возникновения мьютексов, которые блокируются и освобождаются на различных этапах.
Следует отметить, что изначально я не писал код, а разработчик, который это сделал, больше не работает в компании.
Овации.
Kornfeld Eliyahu Peter
Я помню проблему в мой день C++ (не использовал мьютекс в .NET), что мы решили ее, заблокировав экземпляры мьютекса всегда в одном и том же порядке, иначе это может привести к блокировке...
Вполне возможно, что ваши потоки запускаются в чередующихся порядках и для этого блокировка появляется в разных порядках, поэтому некоторые из них не будут выпущены правильно и в следующий раз, когда поток ударится, он не сможет получить блокировку и замерзнет...
jugs0101
Спасибо Корнфельду.
Я думаю, что я точно нарисую, какие потоки создаются и где, как долго они работают (похоже, что 3 идентификатора потоков используются во время вызова мьютекса, поэтому они находятся в циклах на протяжении всей продолжительности, если вы понимаете мой дрейф).
Затем я посмотрю, смогу ли я определить какой-либо очевидный способ, которым один замок может произойти и заставить другой замерзнуть.
Это ваше понимание того, что блокировка мьютекса блокируется только на определенном потоке?
Джулиан
Kornfeld Eliyahu Peter
Регистрируйте также запрос на блокировку с именем мьютекса...
Насколько я помню, блокировка мьютекса на вторичном потоке (а не на основном) может привести именно к тому, что вы видите...
jugs0101
Спасибо, имя-это одна вещь, которую я еще не записал. Я дам вам знать, как это происходит.
Спасибо за ваши мысли.
Джулиан
Graeme_Grant
Я бы регистрировал onEnter и onExit для замков. Таким образом, если где-то есть тупик, то у вас будет одна или несколько сломанных пар...
jugs0101
Спасибо. Да, именно это я и делал. Он часто вызывается, и мьютекс завернут в класс, так что у меня есть больше контроля там, чтобы добавить идентификаторы, когда класс создается, что его создало, и счетчик, чтобы указать, какие блокировки заблокированы и освобождены.
Я дам вам знать, как это делается!
Овации.
David_Wimbley
Поскольку у вас есть несколько хороших комментариев по вопросам, связанным с программным обеспечением, еще одна вещь, о которой стоит подумать, - это может быть проблема с оборудованием? Может проблема в компании есть мощный ПК? Я сомневаюсь, что это так, но это может быть что-то, что нужно принять во внимание, поскольку ваш компьютер и другие клиенты не имеют проблем, но одна компания кажется проблематичной.
Кроме того, может ли быть антивирус или какая-то другая третья сторона, вмешивающаяся в работу компьютеров проблемной компании/вашего приложения?
jugs0101
Привет Дэвид,
Да, спасибо за это. Я проверил спецификацию машины, и, насколько я могу судить, все в порядке. Они также не работают над Citrix или чем-то подобным. Я также проверил антивирус. Вполне возможно, что это может быть проблемой, но я не вижу в его журналах ничего, что указывало бы на то, что он вмешался.
Замораживание также не происходит в какой-то конкретной точке во время работы программного обеспечения, это немного случайно. Я наблюдал, как это происходит с ними, и я проверил ресурсы компьютера, когда это произошло, и снова они выглядели нормально.
Я также исследую, может ли вмешиваться другое программное обеспечение, которое у них работает. Единственное, что я знаю, что они работают в фоновом режиме, - это Worldox DMS. Я знаю, что они довольно вовлечены в программное обеспечение (я сам его разработал). Но я не уверен, как это сделать, если это вообще помешало.
В любом случае, я, вероятно, получу еще одну встречу с ними и перепроверю все это. Беда в том, что когда я это делаю, то обычно все работает нормально. Трудный.
Спасибо за Ваш вклад. Приятно поболтать.
Джулиан