Я порождаю дочерний процесс в ASP.NET Core (.NET Framework) с классом Process
:
var process = new Process
{
StartInfo = new ProcessStartInfo(executableDir)
{
Arguments = commandDefinition.CommandDef.ArgumentsAsString,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true,
WorkingDirectory = _contentPath,
},
};
process.Start()
Насколько я понимаю, когда родительский (ASP.Net Core) процесс будет убит, дочерний процесс должен остаться в живых. Я проверил это поведение с помощью двух консольных приложений, и дочерний процесс никогда не уничтожается после уничтожения родительского процесса. Однако, когда я запускаю новый процесс в ASP.NET Core, дочерний процесс убивается, когда:
- IIS перерабатывает приложение.
- MSDeploy публикует новую версию приложения ASP.NET Core.
- При использовании dotnet watch и приложение перезапускается во время изменения кода.
Он не убивается ТОЛЬКО, если родитель убит через диспетчер задач. (После некоторых тестов это не всегда так)
Из вышесказанного я подозреваю, что в ASP.NET Core есть механизм, который убивает все дочерние процессы при успешном завершении. Это где-то задокументировано? Есть ли способ избежать этого? Я не мог найти никакой информации о таком поведении.
Редактировать: на самом деле довольно легко.
- Создать проект ASP.NET Core (.NET Framework или .NET Core, не имеет значения)
- Добавьте код ниже в свой класс
Startup
- Запустите веб-приложение. Он будет размещен в IIS Express. Процесс вычисления начнется. Теперь либо убейте свое приложение через диспетчер задач, либо закройте его с помощью значка IIS Express на панели задач.
- Процесс Calc будет убит. (Иногда вам нужно обновить свою офлайн-страницу)
var process = new Process
{
StartInfo = new ProcessStartInfo("calc.exe")
{
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true,
},
};
process.Start();
Edit2: проблема, кажется, в IIS. У меня есть два профиля в файле launchSettings.json. Если я запускаю его с IISExpress, то он закрывается, однако при использовании второго он живет.
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "api/values",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"WebApplication3Core": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "api/values",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:52135/"
}
Edit4:
Я провел некоторые исследования с монитором процесса, и вот результат:
Как вы можете видеть в ss1, что есть операция "Выход из процесса" с iisexpress, тогда есть много ненужных журналов и через некоторое время есть выход из процесса для calc.exe. Это ничем не отличается от нормального выхода. Разница лишь в последнем журнале, который говорит "CloseFile" и путь к моему веб-приложению, я не знаю, что это на самом деле означает. Это определенно тот, кто убивает calc.exe. У меня есть версия IIS Express 10.0.14358 (версия сервера, где я нашел это также 10)