У меня есть служба Windows, которая следит за папкой для новых создаваемых файлов. Когда файл добавляется в папку, служба отправляет файл для обработки во 2-е приложение.Второе приложение на самом деле является консольным приложением, но оно установлено как «Приложение Windows», чтобы избежать создания окна консоли.Служба и второе приложение работают на сервере.Чтобы реализовать только один файл для обработки каждый раз, во 2-м приложении был реализован семафор, например:
public class Program
{
static Semaphore semaphore;
[STAThread]
static void Main(string[] args)
{
StartupConfigurator startConfig = new StartupConfigurator();
semaphore = new Semaphore(1, 1, "2ndApp");
semaphore.WaitOne();
startConfig.StartProcessCommandLine(args);
semaphore.Release(1);
Environment.Exit(1);
}
}
Это прекрасно работает, пока приложение корректно завершает работу и семафор освобождается.Во 2-м приложении есть строка кода, которая во время выполнения просто зависает (в основном она пытается войти на сервер, но не удается, причины для 2-го приложения не известны), она просто висит там.Из-за способа написания сервиса он будет запускать новый экземпляр 2-го приложения каждый раз, когда создается новый файл.Это может быть добавление нового файла или добавление нескольких файлов одновременно в отслеживаемую папку.Например, если в просматриваемую папку добавлено 4 файла, служба запустит 4 экземпляра 2-го приложения.Второе приложение завершает файл, семафор освобождается и обрабатывается следующий файл.Это работает нормально, если так, то есть выходит изящно.В случае зависания единственный способ возобновить обработку - это закрыть все экземпляры из диспетчера задач, и не поможет только завершение проблемного экземпляра, все они должны быть завершены.
обсуждение подобной темы здесь , но я не могу знать, как его использовать.Есть ли способ для второго приложения узнать, что оно было принудительно завершено и семафор может быть освобожден.
С уважением.