В схеме вещей несколькими миллионами строк не является особенно большая База данных.
Принятие мы говорим о базе данных OLTP, денормализовывая без первой идентификации, что первопричина Ваших узких мест очень, очень плохая идея .
первая вещь, которую необходимо сделать, представить рабочую нагрузку запроса по представительному периоду времени для идентификации, где большая часть работы делается (например, с помощью SQL Profiler при использовании SQL Server). Посмотрите на количество логических чтений, которые запрос выполняет умноженный на выполняемое количество раз. Как только Вы определили лучшие десять худших запросов выполнения, необходимо исследовать планы выполнения запросов подробно.
я собираюсь рискнуть здесь (потому что это обычно имеет место), но я был бы удивлен, не ли Ваша проблема или
Это , ТАКИМ ОБРАЗОМ, ответ описывает, как представить для нахождения худших запросов выполнения в рабочей нагрузке.
ServiceController имеет метод WaitForStatus, в который вы передаете ему аргумент типа ServiceControllerStatus. Вы можете использовать его так:
controller.WaitForStatus(ServiceControllerStatus.Running);
Я бы, вероятно, создал отдельную thead, чтобы просто опросить и посмотреть, изменилось ли состояние вашего сервисного контроллера , когда происходит изменение, убить этот поток. Затем просто повторно создайте поток, когда вам нужно начать повторный опрос
Darknight
Используйте объект события ядра . Когда вы запускаете оба приложения, попросите их создать или открыть именованный объект Event, а затем дождаться его. Другой может сигнализировать об этом, изменяя состояние, позволяя другому приложению перестать ждать и работать.
Используйте EventWaitHandle . Ваш графический интерфейс может ждать WaitHandle, и служба установит его, что заставит графический интерфейс продолжить то, что он делал до начала ожидания. Без опросов, без циклов, без беспорядка.
Эта замечательная статья о потоках в C # , вероятно, лучший источник информации о WaitHandles