public byte[] Send(byte[] data) { if (isTranferDead) { return(new byte[0]); } var rap = TpLspHelper.NewUID(); var sync = new Synchronizer(true); var result = new byte[0]; _synchronizer.TryAdd(rap, (rslt) => { result = rslt; sync.Unlock(); }); SendManager(data, rap); if (!sync.Wait(TimeSpan.FromMinutes(15))) // timeout { return(new byte[0]); } Action <byte[]> res; _synchronizer.TryRemove(rap, out res); return(result); }
Thread StartListener(Stream transferChannel, System.Action <ulong, byte[]> receiveDataSet) { var listenThrd = new Thread(() => { // Listener thread try { var pkgBuilder = new Dictionary <uint, DataBuilder>(); while (true) { foreach (var tpLspS in TpLspHelper.SequenceReader(transferChannel)) { if (tpLspS.IsQuantizied) { DataBuilder db = null; if (!pkgBuilder.TryGetValue(tpLspS.QuantId, out db)) { db = new DataBuilder(tpLspS.DataLength); pkgBuilder.Add(tpLspS.QuantId, db); } db.WriteData(tpLspS.QuantData, tpLspS.QuantShift); if (db.IsComplete()) { var result = db.GetData(); pkgBuilder.Remove(tpLspS.QuantId); receiveDataSet.Invoke(tpLspS.Rap, result); } } else { var result = tpLspS.QuantData; receiveDataSet.Invoke(tpLspS.Rap, result); } } } } catch (Exception e) { isTranferDead = true; OnConnectionError(e); } }) { IsBackground = true, Priority = ThreadPriority.Normal }; listenThrd.Start(); return(listenThrd); }
private void SendManager(byte[] data, ulong rap) { try { using (var sync = Stream.Synchronized(_sendStream)) { foreach (var quant in TpLspHelper.Quantize(data, _quantSize, rap)) { lock (_sendLocker) { sync.Write(quant, 0, quant.Length); } } } OnTransferSuccess(); } catch (Exception e) { OnConnectionError(e); } }