Если ваш пользовательский интерфейс замерзает в то время как многие фоновые рабочие активны, но восстанавливается, когда эти фоновые рабочие закончили обработку, то скорее всего, Поток пользовательского интерфейса выполняет метод, ожидающий результата или сигнала от одного из потоков рабочего потока.
Чтобы исправить возникшую проблему, вам нужно будет найти код, соответствующий UI, который имеет отношение к синхронизации/многопоточности. Это могут быть места, где используется один из многих объектов синхронизации .NET (включая оператор lock
), но он также может включать в себя «немые» опросные петли a-ka while(!worker.IsFinished) Thread.Sleep();
.
Другой возможной причиной замораживания может быть то, что вы случайно запускаете рабочий (или связанный с работником метод) случайный поток в потоке пользовательского интерфейса в фоновом потоке.
Но вы узнаете, когда используете отладчик.
Чтобы избежать проблем, связанных с поиском проблемных методов, пусть ваша программа запускается в отладчике до тех пор, пока пользовательский интерфейс не замерзнет. В этот момент приостановите выполнение программы в отладчике. Посмотрите, какой код обрабатывается потоком пользовательского интерфейса, и вы обнаружите один экземпляр кода-нарушителя. (Независимо от того, что не так, я не могу сказать вам, потому что я не знаю вашего кода.)
Вполне возможно, что разные методы, связанные с пользовательским интерфейсом, будут подвержены той же проблеме. Итак, если вы обнаружили код нарушения (и смогли его исправить), вы бы хотели проверить другие проблемные методы, но это должно быть довольно легко, так как в этот момент вы будете знать, что искать ...
Количество потоков должно быть неактуальным, поскольку причиной вашей проблемы. Пожалуйста, уточните, где находится ваш код. Используйте отладчик, чтобы увидеть, в каком состоянии находятся потоки вашей программы, когда она зависает. Если вы считаете, что знаете, что является висящим/оскорбительным кодом, отправьте его здесь, чтобы мы могли помочь. – elgonzo
Уважаемый elgonzo, проблема в том, что пользовательский интерфейс висит, и я не могу свести к минимуму или увеличить окно, я не могу нажать любую кнопку. Мне просто нужен способ, с помощью которого пользовательский интерфейс может работать быстрее со всеми этими работниками. Спасибо за ответ ур. – user2489259
Используйте отладчик. Прямо сейчас вы просите нас ткнуть в темноту и сделать слепое предположение. Возможно, у вас есть тупик, возможно, у вас слишком много подключений DB, может быть, что-то другое. Кто знает...? – elgonzo