/// <summary> /// 代理分发请求 /// </summary> public void Accept(IAsyncResult iar) { TcpListener listener = iar.AsyncState as TcpListener; TcpClient source = listener.EndAcceptTcpClient(iar); // 开始接受下一个请求。 "等待下一个请求".Log(); listener.BeginAcceptTcpClient(new AsyncCallback(Accept), listener); source.SendTimeout = 300000; source.ReceiveTimeout = 300000; PhpCgiProcess worker = Dispatcher.Dispatch(); ThreadPool.QueueUserWorkItem(e => { try { worker.Start(source); } catch (Exception exception) { exception.Message.Log(); } }); }
/// <summary> /// 调度请求。 /// </summary> /// <param name="source"></param> public PhpCgiProcess Dispatch() { if (!ticker.Enabled) { ticker.Start(); } lock (processes) { PhpCgiProcess worker = null; DateTime start = DateTime.Now; "当前进程数 {0:D}".Log(processes.Count); foreach (PhpCgiProcess process in processes) { if (process.IsReusable) { "进程 {0:D} 接受调度".Log(process.Port); worker = process; process.IsReusable = false; break; } } if (worker == null) { worker = new PhpCgiProcess(Archive.FileFolder, FindUsablePort()); processes.Add(worker); "新进程 {0:D} 接受调度".Log(worker.Port); } TimeSpan d = DateTime.Now.Subtract(start); "调度 {0:D} 锁耗时 {1:N} ms".Log(worker.Port, d.TotalMilliseconds); return(worker); } }