Я работаю над клиент-серверным приложением. В определенные моменты времени на определенных машинах, когда более 5 клиентов запрашивают данные, кажется, что они зашли в тупик. Если я вмешаюсь, чтобы решить проблему, то программа, кажется, обрабатывает. Просто установите точку останова, когда я знаю, что программа выполняется, и если она несколько раз достигнет точки останова, это приведет к ее завершению. Если я вставлю Thread.Sleep (0) в определенные моменты кода, в основном вокруг некоторых интенсивных циклов ЦП, это, по-видимому, в значительной степени решит проблему. Единственная проблема, которая у меня возникла сейчас, заключается в том, что если я вызову Thread.Sleep (0) слишком много, это может замедлить код. Если я не называю это достаточно, код, кажется, в тупике. Хотя я могу убедиться, что он не находится в тупике, потому что, если я войду в код, это приведет к исчезновению проблемы просто потому, что я приостанавливаю поток.
Есть ли хороший способ отследить, что именно вызывает это. Кажется, что это происходит только на моем ноутбуке с Windows Vista, но не на моем компьютере с Windows XP. Тем не менее, отладка невозможна, потому что простое вмешательство в код приводит к устранению проблемы. Я читал комментарии о том, что вызов Thread.Sleep (0) является плохой практикой и не должен быть необходим, и мне не нравится вставлять код типа колдовства в мои приложения, и я не понимаю, почему он должен быть там , Любые указатели будут с благодарностью.
[EDIT]
Я также могу убедиться, что код все еще работает, когда он «заблокирован», потому что, если я оставлю его достаточно долго, он закончится, только количество времени, которое потребуется, будет на много порядков выше. Я имею в виду, что на самом деле это по крайней мере в 100 раз медленнее, когда он находится в этом «заблокированном» режиме. ЦП привязан на 80-95%, поэтому он работает, хотя то, что он делает, мне не подходит, потому что на выполнение задачи уходит вечность.
[Подробнее]
Просто потому, что все здесь настаивают на том, что это тупик, я удалил весь код, который делал любую блокировку. Была только пара строк кода, которые делали какие-либо блокировки. Потоки по большей части работают совершенно независимо, поэтому совсем не сложно было полностью снять блокировку. Тем не менее проблема сохраняется. В моем коде больше нет синхронизирующих тактов, больше нет мьютексов, больше не видно того, что, как я вижу, могло бы привести к тупику, но проблема все еще существует. И это не тупик. Он работает, хотя и очень медленно, хотя и поглощает все ресурсы процессора.