public static void Add(SortRequest request) { lock (_sort_stats) { SortState sortstate = new SortState (); sortstate.ID = request.ID; sortstate.State = State.queued; _sort_stats.AddFirst (sortstate); // свежие записи -- в начало списка, старые остаются в конце } lock (_sort_queue) { _sort_queue.Enqueue (request); } }
public Server(int port) { TcpListener Listener = new TcpListener (IPAddress.Any, port); Listener.Start(); TcpClient Client = Listener.AcceptTcpClient (); // ждать подключение единственного клиента while (true) { string text = ""; int count; byte[] buffer = new byte[1024]; while (true) { count = Client.GetStream ().Read (buffer, 0, buffer.Length); text += Encoding.ASCII.GetString (buffer, 0, count); if (text.IndexOf("\r\n\r\n") >= 0 || text.Length > 4096) { break; } } // ждать сообщение // parse string query = new string (text.Skip (6).TakeWhile (c => c != ' ').ToArray ()); NameValueCollection qscoll = HttpUtility.ParseQueryString (query); if (qscoll.Keys [0] == "get") { int id = Convert.ToInt32 (qscoll ["get"]); SortState sortstate = Worker.GetState (id); lock (sortstate) { string data = sortstate.State == State.ready ? File.ReadAllText (sortstate.Filename) : null; string json = "{\r\n\t\"state\": \"" + sortstate.State + "\"\r\n\t\"data\": [" + data + "]\r\n}"; Send (Client, buffer, json); } } else if (qscoll.Keys [0] == "concurrency" && qscoll.Keys [1] == "sort") { SortRequest res = new SortRequest (); res.N = Convert.ToInt32 (qscoll ["concurrency"]); res.Url = qscoll ["sort"]; Worker.Add (res); Send (Client, buffer, res.ID.ToString ()); } else { Send (Client, buffer, ""); // ответ на запрос иконки, и т.п. } } }