Beispiel #1
0
        /// <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();
                }
            });
        }
Beispiel #2
0
        /// <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);
            }
        }