private void StartNodeServer() { lock (SYNC) { if (NodeServerContextInstance == null) { var args = new[] { Path.Combine(_env.ContentRootPath, "testing/helpers/vectormaputils-tester.js"), Path.Combine(_env.ContentRootPath, PathToDataDirectory) }; NodeServerContextInstance = new NodeServerContext(PathToNode, String.Join(" ", args.Select(QuoteArg))); ThreadPool.QueueUserWorkItem(NodeServerThreadFunc); NodeServerContextInstance.waitHandle.WaitOne(); } ++NodeServerContextInstance.counter; } }
private static void NodeServerThreadFunc(object state) { using (var process = StartProcess(NodeServerContextInstance.pathToNode, NodeServerContextInstance.arguments)) { NodeServerContextInstance.waitHandle.Set(); while (true) { Thread.Sleep(NodeServerCheckTimeout); lock (SYNC) { if (NodeServerContextInstance.counter == 0 && DateTime.Now > NodeServerContextInstance.timeout) { NodeServerContextInstance = null; process.Kill(); return; } } } } }