/// <summary> /// Remember use stream.Flush() to force data send, Tcp Client always write data into buffer. /// </summary> /// <param name="buff"></param> /// <param name="offset"></param> /// <param name="length"></param> public void WriteBytes(byte[] buff, int offset, int length) { if (this.MyTcpClient == null) { return; } if (!this.MyTcpClient.Connected) { return; } try { var stm = this.MyTcpClient.GetStream(); stm.Write(buff, offset, length); stm.Flush(); } catch (Exception ex) { //資料寫入錯誤, 普遍是斷線造成, 先中斷連線清除資料 this.Disconnect(); CtkLog.WarnNs(this, ex); } //stm.BeginWrite(buff, offset, length, new AsyncCallback((ar) => //{ // //CtkLog.WriteNs(this, "" + ar.IsCompleted); //}), this); }
public ComplexD[] FftForwardJustD(ComplexD[] input) { try { return(this.CudafyContext.FftForward(input)); } catch (CtkCudafyCannotUseException ex) { IsUseCudafy = false; CtkLog.WarnNs(this, ex.StackTrace); } catch (Cudafy.CudafyCompileException ex) { IsUseCudafy = false; CtkLog.WarnNs(this, ex.StackTrace); } catch (System.ComponentModel.Win32Exception ex) { IsUseCudafy = false; CtkLog.WarnNs(this, ex.StackTrace); } catch (NotSupportedException ex) { IsUseCudafy = false; CtkLog.WarnNs(this, ex.StackTrace); } return(null); }
/// <summary> /// Clinet Connect End /// </summary> /// <param name="ar"></param> void EndConnectCallback(IAsyncResult ar) { var myea = new CtkNonStopTcpStateEventArgs(); var trxBuffer = myea.TrxMessageBuffer; try { //Lock使用在短碼保護, 例如: 保護一個變數的get/set //Monitor使用在保護一段代碼 Monitor.Enter(this); //一定要等到進去 var state = (CtkTcpSocket)ar.AsyncState; state.WorkSocket = state.ConnSocket; //作為Client時, Work = Conn var client = state.WorkSocket; client.EndConnect(ar); myea.Sender = state; myea.WorkSocket = client; if (!ar.IsCompleted || client == null || !client.Connected) { throw new CtkException("Connection Fail"); } //呼叫他人不應影響自己運作, catch起來 try { this.OnFirstConnect(myea); } catch (Exception ex) { CtkLog.WarnNs(this, ex); } if (this.IsAsynAutoReceive) { client.BeginReceive(trxBuffer.Buffer, 0, trxBuffer.Buffer.Length, SocketFlags.None, new AsyncCallback(EndReceiveCallback), myea); } } //catch (SocketException ex) { } catch (Exception ex) { //失敗就中斷連線, 清除 this.Disconnect(); myea.Message = ex.Message; myea.Exception = ex; this.OnFailConnect(myea); CtkLog.WarnNs(this, ex); } finally { try { this.mreIsConnecting.Set(); /*同步型的, 結束就可以Set*/ } catch (ObjectDisposedException) { } Monitor.Exit(this); } }
void EndConnectCallback(IAsyncResult ar) { var myea = new CtkNonStopTcpStateEventArgs(); var trxBuffer = myea.TrxMessageBuffer; try { //Lock使用在短碼保護, 例如: 保護一個變數的get/set //Monitor使用在保護一段代碼 Monitor.Enter(this);//一定要等到進去 var state = (CtkTcpClient)ar.AsyncState; var client = state.MyTcpClient; client.EndConnect(ar); myea.Sender = state; myea.WorkTcpClient = client; if (!ar.IsCompleted || client.Client == null || !client.Connected) { throw new CtkException("Connection Fail"); } //呼叫他人不應影響自己運作, catch起來 try { this.OnFirstConnect(myea); } catch (Exception ex) { CtkLog.WarnNs(this, ex); } if (this.IsAsynAutoRead) { var stream = client.GetStream(); stream.BeginRead(trxBuffer.Buffer, 0, trxBuffer.Buffer.Length, new AsyncCallback(EndReadCallback), myea); } } //catch (SocketException ex) { } catch (Exception ex) { //失敗就中斷連線, 清除 this.Disconnect(); myea.Message = ex.Message; myea.Exception = ex; this.OnFailConnect(myea); CtkLog.WarnNs(this, ex); } finally { this.mreIsConnecting.Set(); Monitor.Exit(this); } }
public virtual int CfRunOnce() { try { this.ProtoConn.ConnectIfNo();//內部會處理重複要求連線 this.RealExec(); } catch (Exception ex) { CtkLog.WarnNs(this, ex); if (this.Config != null) { var mymsg = string.Format("Loca={0}, Remote={1}, DeviceUid={2}", this.Config.LocalUri, this.Config.RemoteUri, this.Config.DeviceUid); CtkLog.WarnNs(this, mymsg); } Thread.Sleep(3000);//異常斷線後, 先等3秒再繼續 } return(0); }
public void WriteMsg(CtkProtocolTrxMessage msg) { try { //寫入不卡Monitor, 並不會造成impact //但如果卡了Monitor, 你無法同時 等待Receive 和 要求Send //其它作業可以卡 Monitor.TryEnter //此物件會同時進行的只有 Receive 和 Send //所以其它作業卡同一個沒問題: Monitor.TryEnter(this, 1000) var buffer = msg.ToBuffer(); this.WorkSocket.Send(buffer.Buffer, buffer.Offset, buffer.Length, SocketFlags.None); } catch (Exception ex) { this.Disconnect(); //寫入失敗就斷線 CtkLog.WarnNs(this, ex); throw ex; //就例外就拋出, 不吃掉 } }
void EndReadCallback(IAsyncResult ar) { //var stateea = (CtkNonStopTcpStateEventArgs)ar.AsyncState; var myea = (CtkNonStopTcpStateEventArgs)ar.AsyncState; try { var client = myea.WorkTcpClient; if (!ar.IsCompleted || client == null || client.Client == null || !client.Connected) { throw new CtkException("Read Fail"); } var ctkBuffer = myea.TrxMessageBuffer; NetworkStream stream = client.GetStream(); int bytesRead = stream.EndRead(ar); ctkBuffer.Length = bytesRead; //呼叫他人不應影響自己運作, catch起來 try { this.OnDataReceive(myea); } catch (Exception ex) { CtkLog.Write(ex); } if (this.IsAsynAutoRead) { stream.BeginRead(ctkBuffer.Buffer, 0, ctkBuffer.Buffer.Length, new AsyncCallback(EndReadCallback), myea); } } //catch (IOException ex) { CtkLog.Write(ex); } catch (Exception ex) { //讀取失敗, 中斷連線(會呼叫 OnDisconnect), 不需要呼叫 OnFailConnect this.Disconnect(); myea.Message = ex.Message; myea.Exception = ex; this.OnErrorReceive(myea);//但要呼叫 OnErrorReceive CtkLog.WarnNs(this, ex); } }
public void Write(List <double> dataList, DateTime?time = null) { if (dataList.Count <= 0) { return; } var now = DateTime.Now; if (time != null) { now = time.Value; } var nowUtc = now.ToUniversalTime();//寫資料, 要求傳入Utc //每分鐘 -> 實際儲存 var fn = string.Format("dt{0}.signal.lock", now.ToString("yyyyMMddHHmm")); var dir = Path.Combine(this.Config.DirectoryPath, "dt" + now.ToString("yyyyMMdd")); var currfp = Path.Combine(dir, fn); var currfi = new FileInfo(currfp); try { //一秒內要進入 if (!Monitor.TryEnter(this, 1000)) { CtkLog.WarnNs(this, "時限內無法進入Signal file create"); return; } //檔名是否需要置換了 if (this.fwriter == null || this.fi.FullName != currfi.FullName) { var lockFp = this.fi == null ? null : this.fi.FullName; var nonLockFp = lockFp == null ? null : Regex.Replace(lockFp, @"\.lock$", ""); //先關掉舊檔 if (this.fwriter != null) { this.CloseStream(ref this.fwriter); } //再Reanme, 將檔案的.lock移除 if (lockFp != nonLockFp) { File.Move(lockFp, nonLockFp); } //不等待Event的工作, 避免來不及寫入 Task.Factory.StartNew(() => { this.OnFileChanged(new SNetFileStorageEventArgs() { PrevFilePath = nonLockFp, CurrFilePath = currfi.FullName, }); }); this.fi = currfi; if (!this.fi.Directory.Exists) { this.fi.Directory.Create(); } this.fwriter = new StreamWriter(currfi.FullName, false, Encoding.UTF8);//操作用 lock 檔 this.fsInfo.WriteHeader(this.fwriter); } //檔案是當前時區 this.fsInfo.WriteValues(this.fwriter, nowUtc, dataList); this.fwriter.Flush(); this.DeleteOld(); } finally { Monitor.Exit(this); } }