2013-10-20 9 views
0

Я работаю над 35 партиями, обновляя многие базы данных как часть нашего ежедневного процесса на работе. Каждая партия была разработана в одном веб-приложении. Из-за проблем с базой данных, я собрал все их в одном приложении Windows, чтобы использовать пул соединений с БД, и я назначил одного рабочего стола для каждой партии. Достигая 20 партий в приложении, все работает хорошо. Но когда я добавляю какой-либо другой фоновой рабочий для любой другой партии, приложение зависает. Я думаю, это связано с тем, что я запускаю слишком много потоков в одном процессе. Есть ли решение этой проблемы, например, чтобы приложение работало со многими процессами? !!!. С уважением,многопроцессорность в приложении winforms

Примечание: Я назначил одну машину для этого приложения (Core i7 cpu, 8 gb ram).

+0

Количество потоков должно быть неактуальным, поскольку причиной вашей проблемы. Пожалуйста, уточните, где находится ваш код. Используйте отладчик, чтобы увидеть, в каком состоянии находятся потоки вашей программы, когда она зависает. Если вы считаете, что знаете, что является висящим/оскорбительным кодом, отправьте его здесь, чтобы мы могли помочь. – elgonzo

+0

Уважаемый elgonzo, проблема в том, что пользовательский интерфейс висит, и я не могу свести к минимуму или увеличить окно, я не могу нажать любую кнопку. Мне просто нужен способ, с помощью которого пользовательский интерфейс может работать быстрее со всеми этими работниками. Спасибо за ответ ур. – user2489259

+0

Используйте отладчик. Прямо сейчас вы просите нас ткнуть в темноту и сделать слепое предположение. Возможно, у вас есть тупик, возможно, у вас слишком много подключений DB, может быть, что-то другое. Кто знает...? – elgonzo

ответ

0

Сколько баз данных необходимо обновить?

Я думаю, что это более рекомендуется иметь несколько потоков, как количество баз данных

+0

хорошее решение, но каждая партия имеет конкретную работу и другое время работы. т.е. один запуск каждые 30 секунд, другой - каждые 5 секунд и так далее. – user2489259

0

Если ваш пользовательский интерфейс замерзает в то время как многие фоновые рабочие активны, но восстанавливается, когда эти фоновые рабочие закончили обработку, то скорее всего, Поток пользовательского интерфейса выполняет метод, ожидающий результата или сигнала от одного из потоков рабочего потока.

Чтобы исправить возникшую проблему, вам нужно будет найти код, соответствующий UI, который имеет отношение к синхронизации/многопоточности. Это могут быть места, где используется один из многих объектов синхронизации .NET (включая оператор lock), но он также может включать в себя «немые» опросные петли a-ka while(!worker.IsFinished) Thread.Sleep();.

Другой возможной причиной замораживания может быть то, что вы случайно запускаете рабочий (или связанный с работником метод) случайный поток в потоке пользовательского интерфейса в фоновом потоке.

Но вы узнаете, когда используете отладчик.

Чтобы избежать проблем, связанных с поиском проблемных методов, пусть ваша программа запускается в отладчике до тех пор, пока пользовательский интерфейс не замерзнет. В этот момент приостановите выполнение программы в отладчике. Посмотрите, какой код обрабатывается потоком пользовательского интерфейса, и вы обнаружите один экземпляр кода-нарушителя. (Независимо от того, что не так, я не могу сказать вам, потому что я не знаю вашего кода.)

Вполне возможно, что разные методы, связанные с пользовательским интерфейсом, будут подвержены той же проблеме. Итак, если вы обнаружили код нарушения (и смогли его исправить), вы бы хотели проверить другие проблемные методы, но это должно быть довольно легко, так как в этот момент вы будете знать, что искать ...

Смежные вопросы