private Task SendRequestAsync(WsTradeMessageRequest msg, Action <int, object> action, CancellationToken cancellationToken) { if (this._ws == null || this._ws.State != WebSocketState.Open) { throw new InvalidOperationException("websocket is not open"); } try { _request_callback[msg.ReqID] = action; return(this._ws?.SendAsync(new ArraySegment <byte>(msg.GetSigneBuffer(_apikey, _apisecret)), WebSocketMessageType.Text, true, cancellationToken)); } catch (Exception ex) { _request_callback.Remove(msg.ReqID); throw ex; } }
/// <summary> /// 与服务器比对时间 /// </summary> /// <param name="cb"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public async Task REQ_TimeAsync(Action <int, long> cb, CancellationToken cancellationToken) { long localtm = DateTimeOffset.Now.ToUnixTimeMilliseconds(); var req = new WsTradeMessageRequest("Time", localtm); await this.SendRequestAsync(req, (code, data) => { // {"code":0,"data":{"data":"1545808556560","time":1545808556646},"rid":"14"} long delta = 0; if (code == 0) { var obj = data as Newtonsoft.Json.Linq.JObject; if (obj != null && obj.ContainsKey("time")) { var servertm = obj["time"].ToObject <long>(); delta = servertm - localtm; } } cb(code, delta); }, cancellationToken); }