private void ClientSocket_OnMessage(object sender, MessageEventArgs e) { if (!e.IsBinary) { return; } SimplePacket packet = StreamUtils.ReadPacket(e.RawData); lock (keepAliveSw) if (keepAliveSw.IsRunning) { keepAliveSw.Restart(); } switch (packet.Type) { case PacketType.TaskInput: if (Status != Packets.WorkerStatus.None) { Logger.Log("Bad state"); clientSocket.Close(); return; } clientSocket.Send(new Packets.WorkerInfo() { OkPart = 0, Status = Packets.WorkerStatus.Working, System = Platform }.GetPacket()); Status = Packets.WorkerStatus.Working; StartProcessing(packet.Data); break; case PacketType.Signal: Packets.Signal signal = new Packets.Signal(packet); switch (signal.Type) { case Packets.SignalEnum.Abort: workerThread.Abort(); while (!(workerThread.ThreadState == System.Threading.ThreadState.Stopped || workerThread.ThreadState == System.Threading.ThreadState.Unstarted || workerThread.ThreadState == System.Threading.ThreadState.Aborted)) { Thread.Sleep(1); } Logger.Log("Aborted"); clientSocket.Send(new Packets.Signal() { Data = new byte[0], Type = Packets.SignalEnum.Abort }.GetPacket().GetBytes()); Status = Packets.WorkerStatus.None; break; } break; } return; }
public static void WritePacket(Stream stream, SimplePacket packet) { WriteShort(stream, (short)packet.Type); stream.Write(packet.Data, 0, packet.Data.Length); }
private void DoWork(object inputObj) { Stopwatch sw = new Stopwatch(); sw.Start(); logger.Debug("Started working"); byte[] input = (byte[])inputObj; //CHANGE LATER -------> \/ IMainVoid mainVoid; try { Logger.Log($"Loading class {config["mainvoid"].Value<string>()}"); object controllerInstance = Activator.CreateInstance(Type.GetType(config["mainvoid"].Value <string>())); mainVoid = (IMainVoid)controllerInstance; Logger.Log($"Class {config["mainvoid"].Value<string>()} loaded successfully"); } catch (Exception e) { Logger.Log($"Can't load class {config["mainvoid"].Value<string>()}; Exception: {e}; Loading default class"); mainVoid = new MainVoid(); } mainVoid.Setup(config); //CHANGE LATER -------> /\ try { byte[] dataBytes = new SimplePacket() { Type = PacketType.TaskOutput, Data = mainVoid.DoIt(input, (x) => { try { if (sw.ElapsedMilliseconds < 750) { return; } sw.Restart(); if (x < 0 || x > 1) { return; } if (!clientSocket.IsAlive) { return; } clientSocket.Send(new Packets.WorkerInfo() { OkPart = x, Status = Packets.WorkerStatus.Working, System = Platform }.GetPacket()); } catch { } }) }.GetBytes(); Status = Packets.WorkerStatus.None; if (clientSocket.IsAlive) { clientSocket.Send(dataBytes); } } catch (Exception e) { if (e is ThreadAbortException) { Logger.Log($"Thread aborted: {e.Message}"); } else { try { if (clientSocket.IsAlive) { clientSocket.Send(new SimplePacket() { Type = PacketType.TaskOutput, Data = Encoding.UTF8.GetBytes($"Exception: {e}") }.GetBytes()); } } catch { Logger.Log($"Nice error: {e}"); } } } Status = Packets.WorkerStatus.None; logger.Debug("End working"); }