У меня есть служба Windows, которая контролирует папку для создания новых файлов. Когда файл будет добавлен в папку, служба отправит файл для обработки второму приложению. 2-е приложение фактически является консольным приложением, но установлено как «Приложение Windows», чтобы избежать создания окна консоли. Служба и второе приложение работают на сервере. Для реализации только один файл, чтобы обработать каждый раз, семафор был реализован в 2-приложение, например, так:Как обрабатывать события закрытия приложений с помощью C#
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);
}
}
Это прекрасно работает до тех пор, как Applicatin выходит изящно и семафор освобождается. Во втором приложении есть строка кода, которая во время выполнения просто зависает (в основном пытается войти на сервер, но не удается, причины не доступны для 2-го приложения), он просто висит там. Из-за способа написания службы он запускает новый экземпляр 2-го приложения каждый раз, когда создается новый файл. Это может быть добавление нового файла или добавление сразу нескольких файлов в просматриваемую папку. Например, если 4 файла отбрасываются в просматриваемую папку, служба запустит 4 экземпляра второго приложения. Второе приложение завершает файл, семафор освобождается и обрабатывается следующий файл. Это прекрасно работает, если он делает это, т. Е. Выходит изящно. В случае, когда он зависает, единственным способом возобновить обработку является закрытие всех экземпляров из Диспетчера задач, завершение только проблемного экземпляра тоже не поможет, все они должны быть завершены.
Было обсуждение по теме here, но я не знаю, как ее использовать. Есть ли способ, чтобы второе приложение узнало, что оно было принудительно закончено, и семафор можно освободить.
С уважением.
Я полагаю, вы должны предотвратить наложение 2-го приложения ... Положите тайм-аут вокруг операции подвешивания. – zmbq
Сначала добавьте попытку/наконец, чтобы убедиться, что семафор выпущен, если выбрано исключение (это не поможет, если вы его убьете, это просто хорошая идея). Во-вторых, вы не можете сделать время входа в систему, а не вешать бесконечно? – Sven