/// <summary> /// Dequeue messages from a persistent message queue file at server side in batch /// </summary> /// <param name="key">An ASCII string for identifying a queue at server side</param> /// <param name="d">A callback for tracking data like remaining message count within a server queue file, queue file size in bytes, message dequeued within this batch and bytes dequeued within this batch</param> /// <param name="timeout">A time-out number in milliseconds</param> /// <param name="discarded">a callback for tracking cancel or socket closed event</param> /// <returns>true for sending the request successfully, and false for failure</returns> public virtual bool Dequeue(byte[] key, DDequeue d, uint timeout, DDiscarded discarded) { DAsyncResultHandler rh = null; lock (m_csQ) { m_keyDequeue = key; if (d != null) { rh = (ar) => { ulong messageCount, fileSize, ret; ar.UQueue.Load(out messageCount).Load(out fileSize).Load(out ret); uint messages = (uint)ret; uint bytes = (uint)(ret >> 32); d((CAsyncQueue)ar.AsyncServiceHandler, messageCount, fileSize, messages, bytes); }; m_dDequeue = d; } else { m_dDequeue = null; } } using (CScopeUQueue sb = new CScopeUQueue()) { CUQueue q = sb.UQueue; q.Save(key).Save(timeout); return(SendRequest(idDequeue, q, rh, discarded, (DOnExceptionFromServer)null)); } }
protected override void OnPostProcessing(uint hint, ulong data) { CContext ctx = null; CClientSocket cs = AttachedClientSocket; lock (m_csFile) { if (m_vContext.Count > 0) { CContext context = m_vContext[0]; if (context.Uploading) { OpenLocalRead(context); } else { OpenLocalWrite(context); } DAsyncResultHandler rh = null; DOnExceptionFromServer se = null; if (context.HasError) { ctx = context; } else if (context.Uploading) { if (!SendRequest(idUpload, context.FilePath, context.Flags, context.FileSize, rh, context.Discarded, se)) { ctx = context; context.ErrCode = cs.ErrorCode; context.ErrMsg = cs.ErrorMsg; } } else { if (!SendRequest(idDownload, context.LocalFile, context.FilePath, context.Flags, context.InitSize, rh, context.Discarded, se)) { ctx = context; context.ErrCode = cs.ErrorCode; context.ErrMsg = cs.ErrorMsg; } } } } if (ctx == null) { return; } if (ctx.Download != null) { ctx.Download(this, ctx.ErrCode, ctx.ErrMsg); } lock (m_csFile) { CloseFile(m_vContext.RemoveFromFront()); if (m_vContext.Count > 0) { ClientCoreLoader.PostProcessing(AttachedClientSocket.Handle, 0, 0); AttachedClientSocket.DoEcho(); //make sure WaitAll works correctly } } }
/// <summary> /// Dequeue messages from a persistent message queue file at server side in batch /// </summary> /// <param name="key">An ASCII string for identifying a queue at server side</param> /// <param name="d">A callback for tracking data like remaining message count within a server queue file, queue file size in bytes, message dequeued within this batch and bytes dequeued within this batch</param> /// <param name="timeout">A time-out number in milliseconds</param> /// <returns>true for sending the request successfully, and false for failure</returns> public bool Dequeue(byte[] key, DDequeue d, uint timeout) { DAsyncResultHandler rh = null; if (key == null) key = new byte[0]; lock (m_csQ) { m_keyDequeue = key; if (d != null) { rh = (ar) => { ulong messageCount, fileSize, ret; ar.Load(out messageCount).Load(out fileSize).Load(out ret); uint messages = (uint)ret; uint bytes = (uint)(ret >> 32); d(messageCount, fileSize, messages, bytes); }; m_dDequeue = d; } else { m_dDequeue = null; } } using (CScopeUQueue sb = new CScopeUQueue()) { sb.Save(key).Save(timeout); return SendRequest(idDequeue, sb, rh); } }
public virtual bool SendRequest(ushort reqId, CScopeUQueue q, DAsyncResultHandler ash) { if (q == null) { return(SendRequest(reqId, ash)); } return(SendRequest(reqId, q.UQueue, ash)); }
public virtual bool SendRequest(ushort reqId, CScopeUQueue q, DAsyncResultHandler ash, DDiscarded discarded, DOnExceptionFromServer exception) { if (q == null) { return(SendRequest(reqId, ash, discarded, exception)); } return(SendRequest(reqId, q.UQueue, ash, discarded, exception)); }
public bool SendRequest <T0, T1, T2>(ushort reqId, T0 t0, T1 t1, T2 t2, DAsyncResultHandler ash) { CUQueue su = CScopeUQueue.Lock(); su.Save(t0).Save(t1).Save(t2); bool ok = SendRequest(reqId, su, ash); CScopeUQueue.Unlock(su); return(ok); }
public bool SendRequest <T0, T1, T2>(ushort reqId, T0 t0, T1 t1, T2 t2, DAsyncResultHandler ash, DDiscarded discarded, DOnExceptionFromServer exception) { CUQueue su = CScopeUQueue.Lock(); su.Save(t0).Save(t1).Save(t2); bool ok = SendRequest(reqId, su, ash, discarded, exception); CScopeUQueue.Unlock(su); return(ok); }
public virtual bool SendRequest(ushort reqId, CUQueue q, DAsyncResultHandler ash) { if (q == null) { return(SendRequest(reqId, ash)); } if (q.HeadPosition > 0) { return(SendRequest(reqId, q.GetBuffer(), q.GetSize(), ash)); } return(SendRequest(reqId, q.m_bytes, q.GetSize(), ash)); }
public virtual bool SendRequest(ushort reqId, CUQueue q, DAsyncResultHandler ash, DDiscarded discarded, DOnExceptionFromServer exception) { if (q == null) { return(SendRequest(reqId, ash, discarded, exception)); } if (q.HeadPosition > 0) { return(SendRequest(reqId, q.GetBuffer(), q.GetSize(), ash, discarded, exception)); } return(SendRequest(reqId, q.m_bytes, q.GetSize(), ash, discarded, exception)); }
public bool GetMasterSlaveConnectedSessions(DConnectedSessions cs, DDiscarded discarded = null) { DAsyncResultHandler arh = (ar) => { uint master_connections, slave_conenctions; ar.Load(out master_connections).Load(out slave_conenctions); if (cs != null) { cs(master_connections, slave_conenctions); } }; return(SendRequest(ss.Consts.idGetMasterSlaveConnectedSessions, arh, discarded, (DOnExceptionFromServer)null)); }
private DAsyncResultHandler GetRH(DEnqueue e) { DAsyncResultHandler rh = null; if (e != null) { rh = (ar) => { ulong index; ar.Load(out index); e((CAsyncQueue)ar.AsyncServiceHandler, index); }; } return(rh); }
private DAsyncResultHandler GetRH(DEnqueue e) { DAsyncResultHandler rh = null; if (e != null) { rh = (ar) => { ulong index; ar.Load(out index); e(index); }; } return rh; }
public bool GetRentalDateTimes(long rentalId, DRentalDateTimes rdt, DDiscarded discarded = null) { DAsyncResultHandler arh = (ar) => { int errCode; string errMsg; ss.CRentalDateTimes dates; ar.Load(out dates).Load(out errCode).Load(out errMsg); if (rdt != null) { rdt(dates, errCode, errMsg); } }; return(SendRequest(ss.Consts.idGetRentalDateTimes, rentalId, arh, discarded, (DOnExceptionFromServer)null)); }
public bool UploadEmployees(SocketProAdapter.UDB.CDBVariantArray vData, DUploadEmployees res, DDiscarded discarded = null) { DAsyncResultHandler arh = (ar) => { int errCode; string errMsg; ss.CInt64Array vId; ar.Load(out errCode).Load(out errMsg).Load(out vId); if (res != null) { res(errCode, errMsg, vId); } }; return(SendRequest(ss.Consts.idUploadEmployees, vData, arh, discarded, (DOnExceptionFromServer)null)); }
public bool QueryPaymentMaxMinAvgs(string filter, DMaxMinAvg mma, DDiscarded discarded = null) { DAsyncResultHandler arh = (ar) => { int res; string errMsg; ss.CMaxMinAvg m_m_a; ar.Load(out res).Load(out errMsg).Load(out m_m_a); if (mma != null) { mma(m_m_a, res, errMsg); } }; return(SendRequest(ss.Consts.idQueryMaxMinAvgs, filter, arh, discarded, (DOnExceptionFromServer)null)); }
protected override void OnResultReturned(ushort reqId, CUQueue mc) { switch (reqId) { case idDownload: { int res; string errMsg; mc.Load(out res).Load(out errMsg); DDownload dl = null; lock (m_csFile) { if (m_vContext.Count > 0) { CContext ctx = m_vContext[0]; ctx.ErrCode = res; ctx.ErrMsg = errMsg; dl = ctx.Download; } } if (dl != null) { dl.Invoke(this, res, errMsg); } lock (m_csFile) { if (m_vContext.Count > 0) { CloseFile(m_vContext.RemoveFromFront()); } } OnPostProcessing(0, 0); } break; case idStartDownloading: lock (m_csFile) { long fileSize; string localFile, remoteFile; uint flags; long initSize; mc.Load(out fileSize).Load(out localFile).Load(out remoteFile).Load(out flags).Load(out initSize); lock (m_csFile) { if (m_vContext.Count == 0) { CContext ctx = new CContext(false, flags); ctx.LocalFile = localFile; ctx.FilePath = remoteFile; OpenLocalWrite(ctx); ctx.InitSize = initSize; m_vContext.AddToBack(ctx); } CContext context = m_vContext[0]; context.FileSize = fileSize; initSize = (context.InitSize > 0) ? context.InitSize : 0; if (context.File.Position > initSize) { context.File.SetLength(initSize); } } } break; case idDownloading: { long downloaded = 0; DTransferring trans = null; CContext context = null; lock (m_csFile) { if (m_vContext.Count > 0) { context = m_vContext[0]; trans = context.Transferring; byte[] buffer = mc.IntenalBuffer; try { context.File.Write(buffer, 0, (int)mc.GetSize()); long initSize = (context.InitSize > 0) ? context.InitSize : 0; downloaded = context.File.Position - initSize; } catch (System.IO.IOException err) { context.ErrMsg = err.Message; #if NO_HRESULT context.ErrCode = CANNOT_OPEN_LOCAL_FILE_FOR_WRITING; #else context.ErrCode = err.HResult; #endif } } } mc.SetSize(0); if (context != null && context.HasError) { if (context.Download != null) { context.Download.Invoke(this, context.ErrCode, context.ErrMsg); } CloseFile(m_vContext.RemoveFromFront()); OnPostProcessing(0, 0); } else if (trans != null) { trans.Invoke(this, downloaded); } } break; case idUploadBackup: break; case idUpload: { CContext context = null; int res; string errMsg; mc.Load(out res).Load(out errMsg); if (res != 0 || (errMsg != null && errMsg.Length > 0)) { lock (m_csFile) { if (m_vContext.Count > 0) { context = m_vContext[0]; mc.Load(out context.InitSize); context.ErrCode = res; context.ErrMsg = errMsg; } } } else { CClientSocket cs = Socket; lock (m_csFile) { if (m_vContext.Count > 0) { context = m_vContext[0]; mc.Load(out context.InitSize); using (CScopeUQueue sb = new CScopeUQueue()) { DAsyncResultHandler rh = null; DOnExceptionFromServer se = null; if (sb.UQueue.MaxBufferSize < STREAM_CHUNK_SIZE) { sb.UQueue.Realloc(STREAM_CHUNK_SIZE); } byte[] buffer = sb.UQueue.IntenalBuffer; try { context.QueueOk = cs.ClientQueue.StartJob(); bool queue_enabled = cs.ClientQueue.Available; if (queue_enabled) { SendRequest(idUploadBackup, context.FilePath, context.Flags, context.FileSize, context.InitSize, rh, context.Discarded, se); } int ret = context.File.Read(buffer, 0, (int)STREAM_CHUNK_SIZE); while (ret == STREAM_CHUNK_SIZE) { if (!SendRequest(idUploading, buffer, (uint)ret, rh, context.Discarded, se)) { context.ErrCode = cs.ErrorCode; context.ErrMsg = cs.ErrorMsg; break; } ret = context.File.Read(buffer, 0, (int)STREAM_CHUNK_SIZE); if (queue_enabled) { //save file into client message queue } else if (cs.BytesInSendingBuffer > 40 * STREAM_CHUNK_SIZE) { break; } } if (ret > 0 && !context.HasError) { if (!SendRequest(idUploading, buffer, (uint)ret, rh, context.Discarded, se)) { context.ErrCode = cs.ErrorCode; context.ErrMsg = cs.ErrorMsg; } } if (ret < STREAM_CHUNK_SIZE && !context.HasError) { context.Sent = true; SendRequest(idUploadCompleted, rh, context.Discarded, se); if (context.QueueOk) { Socket.ClientQueue.EndJob(); } } } catch (System.IO.IOException err) { errMsg = err.Message; #if NO_HRESULT res = CANNOT_OPEN_LOCAL_FILE_FOR_READING; #else res = err.HResult; #endif context.ErrCode = res; context.ErrMsg = errMsg; } } } } } if (context != null && context.HasError) { if (context.Upload != null) { context.Upload.Invoke(this, context.ErrCode, context.ErrMsg); } lock (m_csFile) { CloseFile(m_vContext.RemoveFromFront()); } if (context.QueueOk) { Socket.ClientQueue.AbortJob(); } OnPostProcessing(0, 0); } } break; case idUploading: { int errCode = 0; string errMsg = ""; CContext context = null; DTransferring trans = null; long uploaded; mc.Load(out uploaded); if (mc.GetSize() >= 8) { mc.Load(out errCode).Load(out errMsg); } lock (m_csFile) { if (m_vContext.Count > 0) { context = m_vContext[0]; trans = context.Transferring; if (uploaded < 0 || errCode != 0 || errMsg.Length != 0) { context.ErrCode = errCode; context.ErrMsg = errMsg; CloseFile(context); } else if (!context.Sent) { using (CScopeUQueue sb = new CScopeUQueue()) { DAsyncResultHandler rh = null; DOnExceptionFromServer se = null; if (sb.UQueue.MaxBufferSize < STREAM_CHUNK_SIZE) { sb.UQueue.Realloc(STREAM_CHUNK_SIZE); } byte[] buffer = sb.UQueue.IntenalBuffer; try { int ret = context.File.Read(buffer, 0, (int)STREAM_CHUNK_SIZE); if (ret > 0) { SendRequest(idUploading, buffer, (uint)ret, rh, context.Discarded, se); } if (ret < STREAM_CHUNK_SIZE) { context.Sent = true; SendRequest(idUploadCompleted, rh, context.Discarded, se); } } catch (System.IO.IOException err) { context.ErrMsg = err.Message; #if NO_HRESULT context.ErrCode = CANNOT_OPEN_LOCAL_FILE_FOR_READING; #else context.ErrCode = err.HResult; #endif } } } } } if (context != null && context.HasError) { if (context.Upload != null) { context.Upload.Invoke(this, context.ErrCode, context.ErrMsg); } lock (m_csFile) { CloseFile(m_vContext.RemoveFromFront()); } OnPostProcessing(0, 0); } else if (trans != null) { trans.Invoke(this, uploaded); } } break; case idUploadCompleted: { DUpload upl = null; lock (m_csFile) { if (m_vContext.Count > 0) { if (m_vContext[0].File != null) { upl = m_vContext[0].Upload; } else { m_vContext[0].QueueOk = false; m_vContext[0].Sent = false; CloseFile(m_vContext[0]); } } } if (upl != null) { upl.Invoke(this, 0, ""); } lock (m_csFile) { if (m_vContext.Count > 0) { if (m_vContext[0].File != null) { CloseFile(m_vContext.RemoveFromFront()); } } } OnPostProcessing(0, 0); } break; default: base.OnResultReturned(reqId, mc); break; } }
public virtual bool SendRequest(ushort reqId, byte[] data, uint len, DAsyncResultHandler ash) { return(SendRequest(reqId, data, len, ash, null, null)); }
protected override void OnPostProcessing(uint hint, ulong data) { uint d = 0; DAsyncResultHandler rh = null; System.Threading.Monitor.Enter(m_csFile); foreach (CContext it in m_vContext) { if (d >= m_MaxDownloading) { break; } if (it.File != null) { if (it.Uploading) { break; } else { ++d; continue; } } if (it.HasError) { continue; } if (it.Uploading) { OpenLocalRead(it); if (!it.HasError) { if (!SendRequest(idUpload, it.FilePath, it.Flags, it.FileSize, rh, it.Discarded, it.Se)) { CClientSocket cs = Socket; it.ErrCode = cs.ErrorCode; if (it.ErrCode == 0) { it.ErrCode = SESSION_CLOSED_BEFORE; it.ErrMsg = SESSION_CLOSED_BEFORE_ERR_MSG; } else { it.ErrMsg = cs.ErrorMsg; } #if TASKS_ENABLED if (it.Fut != null) { it.Fut.TrySetException(new CSocketError(it.ErrCode, it.ErrMsg, idUpload, true)); it.Discarded = null; it.Se = null; } #endif continue; } break; } } else { OpenLocalWrite(it); if (!it.HasError) { if (!SendRequest(idDownload, it.LocalFile, it.FilePath, it.Flags, it.InitSize, rh, it.Discarded, it.Se)) { CClientSocket cs = Socket; it.ErrCode = cs.ErrorCode; if (it.ErrCode == 0) { it.ErrCode = SESSION_CLOSED_BEFORE; it.ErrMsg = SESSION_CLOSED_BEFORE_ERR_MSG; } else { it.ErrMsg = cs.ErrorMsg; } #if TASKS_ENABLED if (it.Fut != null) { it.Fut.TrySetException(new CSocketError(it.ErrCode, it.ErrMsg, idDownload, true)); it.Discarded = null; it.Se = null; } #endif } ++d; } } } while (m_vContext.Count > 0) { CContext it = m_vContext[0]; if (it.HasError) { CloseFile(it); if (it.Uploading) { DUpload cb = it.Upload; if (cb != null) { int errCode = it.ErrCode; string errMsg = it.ErrMsg; try { System.Threading.Monitor.Exit(m_csFile); cb.Invoke(this, errCode, errMsg); } finally { System.Threading.Monitor.Enter(m_csFile); } } } else { DDownload cb = it.Download; if (cb != null) { int errCode = it.ErrCode; string errMsg = it.ErrMsg; try { System.Threading.Monitor.Exit(m_csFile); cb.Invoke(this, errCode, errMsg); } finally { System.Threading.Monitor.Enter(m_csFile); } } } m_vContext.RemoveFromFront(); } else { break; } } System.Threading.Monitor.Exit(m_csFile); }
public bool SendRequest <T0, T1, T2, T3, T4, T5, T6, T7, T8>(ushort reqId, T0 t0, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, DAsyncResultHandler ash, DDiscarded discarded, DOnExceptionFromServer exception) { CUQueue su = CScopeUQueue.Lock(); su.Save(t0).Save(t1).Save(t2).Save(t3).Save(t4).Save(t5).Save(t6).Save(t7).Save(t8); bool ok = SendRequest(reqId, su, ash, discarded, exception); CScopeUQueue.Unlock(su); return(ok); }
public bool SendRequest(ushort reqId, DAsyncResultHandler ash, DDiscarded discarded, DOnExceptionFromServer exception) { return(SendRequest(reqId, (byte[])null, (uint)0, ash, discarded, exception)); }
public bool SendRequest(ushort reqId, DAsyncResultHandler ash) { return(SendRequest(reqId, (byte[])null, (uint)0, ash)); }
private bool Transfer() { int index = 0; DAsyncResultHandler rh = null; DOnExceptionFromServer se = null; CClientSocket cs = AttachedClientSocket; if (!cs.Sendable) { return(false); } uint sent_buffer_size = cs.BytesInSendingBuffer; if (sent_buffer_size > 3 * STREAM_CHUNK_SIZE) { return(true); } while (index < m_vContext.Count) { CContext context = m_vContext[index]; if (context.Sent) { ++index; continue; } if (context.Uploading && context.Tried && context.File == null) { if (index == 0) { if (context.Upload != null) { context.Upload(this, CANNOT_OPEN_LOCAL_FILE_FOR_READING, context.ErrMsg); } m_vContext.RemoveFromFront(); } else { ++index; } continue; } if (context.Uploading) { if (!context.Tried) { context.Tried = true; try { FileShare fs = FileShare.None; if ((context.Flags & FILE_OPEN_SHARE_READ) == FILE_OPEN_SHARE_READ) { fs = FileShare.Read; } context.File = new FileStream(context.LocalFile, FileMode.Open, FileAccess.Read, fs); context.FileSize = context.File.Length; IClientQueue cq = AttachedClientSocket.ClientQueue; if (cq.Available) { if (!cq.StartJob()) { context.File.Close(); context.File = null; throw new Exception("Cannot start queue job"); } } if (!SendRequest(idUpload, context.FilePath, context.Flags, context.FileSize, rh, context.Discarded, se)) { return(false); } } catch (Exception err) { context.ErrMsg = err.Message; } finally { } } if (context.File == null) { if (index == 0) { if (context.Upload != null) { context.Upload(this, CANNOT_OPEN_LOCAL_FILE_FOR_READING, context.ErrMsg); } m_vContext.RemoveFromFront(); } else { ++index; } continue; } else { using (CScopeUQueue sb = new CScopeUQueue()) { if (sb.UQueue.MaxBufferSize < STREAM_CHUNK_SIZE) { sb.UQueue.Realloc(STREAM_CHUNK_SIZE); } byte[] buffer = sb.UQueue.IntenalBuffer; int ret = context.File.Read(buffer, 0, (int)STREAM_CHUNK_SIZE); while (ret > 0) { if (!SendRequest(idUploading, buffer, (uint)ret, rh, context.Discarded, se)) { return(false); } sent_buffer_size = cs.BytesInSendingBuffer; if (ret < (int)STREAM_CHUNK_SIZE) { break; } if (sent_buffer_size >= 5 * STREAM_CHUNK_SIZE) { break; } ret = context.File.Read(buffer, 0, (int)STREAM_CHUNK_SIZE); } if (ret < (int)STREAM_CHUNK_SIZE) { context.Sent = true; if (!SendRequest(idUploadCompleted, rh, context.Discarded, se)) { return(false); } IClientQueue cq = AttachedClientSocket.ClientQueue; if (cq.Available) { cq.EndJob(); } } if (sent_buffer_size >= 4 * STREAM_CHUNK_SIZE) { break; } } } } else { if (!SendRequest(idDownload, context.FilePath, context.Flags, rh, context.Discarded, se)) { return(false); } context.Sent = true; context.Tried = true; sent_buffer_size = cs.BytesInSendingBuffer; if (sent_buffer_size > 3 * STREAM_CHUNK_SIZE) { break; } } ++index; } return(true); }
public bool SendRequest <T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>(ushort reqId, T0 t0, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7, T8 t8, T9 t9, DAsyncResultHandler ash) { CUQueue su = CScopeUQueue.Lock(); su.Save(t0).Save(t1).Save(t2).Save(t3).Save(t4).Save(t5).Save(t6).Save(t7).Save(t8).Save(t9); bool ok = SendRequest(reqId, su, ash); CScopeUQueue.Unlock(su); return(ok); }
public virtual bool SendRequest(ushort reqId, byte[] data, uint len, DAsyncResultHandler ash, DDiscarded discarded, DOnExceptionFromServer exception) { bool sent; byte batching; MyKeyValue <ushort, CResultCb> kv; if (reqId <= (ushort)tagBaseRequestID.idReservedTwo) { throw new ArgumentException("Request id must be larger than 0x2001"); } if (null == m_ClientSocket) { return(false); } IntPtr h = m_ClientSocket.Handle; if (data != null && len > (uint)data.Length) { len = (uint)data.Length; } if (ash != null || discarded != null || exception != null) { CResultCb rcb = new CResultCb(ash, discarded, exception); kv = new MyKeyValue <ushort, CResultCb>(reqId, rcb); batching = ClientCoreLoader.IsBatching(h); lock (m_csSend) { lock (m_cs) { if (batching != 0) { m_kvBatching.AddToBack(kv); } else { m_kvCallback.AddToBack(kv); } } unsafe { fixed(byte *buffer = data) { sent = (ClientCoreLoader.SendRequest(h, reqId, buffer, len) != 0); } } } } else { kv = null; batching = 0; unsafe { fixed(byte *buffer = data) { sent = (ClientCoreLoader.SendRequest(h, reqId, buffer, len) != 0); } } } if (sent) { return(true); } if (kv != null) { lock (m_cs) { if (batching > 0) { m_kvBatching.Clear(); } else { m_kvCallback.Clear(); } } } return(false); }
public CResultCb(DAsyncResultHandler rh, DDiscarded d, DOnExceptionFromServer ex) { AsyncResultHandler = rh; Discarded = d; ExceptionFromServer = ex; }