private static void ReceiveCallback(IAsyncResult ar) { // Retrieve the state object and the client socket // from the asynchronous state object. StateObject state = (StateObject)ar.AsyncState; Socket client = state.workSocket; // Read data from the remote device. int bytesRead = client.EndReceive(ar); if (bytesRead > 0) { var start = 0; do { var pos = Array.IndexOf(state.buffer, (byte)0, start); if (pos != -1 && pos < bytesRead) { //end separator, full payload availabled state.sb.Append(Encoding.UTF8.GetString(state.buffer, start, pos - start)); string msg = state.sb.ToString(); state.sb = new StringBuilder(); //send message to UI deletage if (Anchor.InvokeRequired) { var d = new ProcessMsgDelegate(ProcessMsg); Anchor.Invoke(d, new object[] { msg }); } else { ProcessMsg(msg); } start = pos + 1; } else { state.sb.Append(Encoding.UTF8.GetString(state.buffer, start, bytesRead - start)); break; } } while (true); client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state); } }
public override PushMsgResult PushMsg(ProcessMsgDelegate sink) => sink(ref m_inProgress);
public abstract PushMsgResult PushMsg(ProcessMsgDelegate sink);