static Task <CAsyncQueue.DeqInfo> TestDequeue(CAsyncQueue aq) { //prepare callback for parsing messages dequeued from server side aq.ResultReturned += (sender, idReq, q) => { bool processed = true; switch (idReq) { case idMessage0: case idMessage1: case idMessage2: Console.Write("message id={0}", idReq); { string name, str; int index; //parse a dequeued message which should be the same as the above enqueued message (two unicode strings and one int) q.Load(out name).Load(out str).Load(out index); Console.WriteLine(", name={0}, str={1}, index={2}", name, str, index); } break; default: processed = false; break; } return(processed); }; TaskCompletionSource <CAsyncQueue.DeqInfo> tcs = new TaskCompletionSource <CAsyncQueue.DeqInfo>(); CAsyncQueue.DDiscarded aborted = CAsyncQueue.get_aborted(tcs, CAsyncQueue.idDequeue); CAsyncQueue.DOnExceptionFromServer se = CAsyncQueue.get_se(tcs); //prepare a callback for processing returned result of dequeue request CAsyncQueue.DDequeue d = (asyncq, messageCount, fileSize, messages, bytes) => { if (messages > 0) { Console.WriteLine("Total message count={0}, queue file size={1}, messages dequeued={2}, message bytes dequeued={3}", messageCount, fileSize, messages, bytes); } if (messageCount > 0) { //there are more messages left at server queue, we re-send a request to dequeue asyncq.Dequeue(TEST_QUEUE_KEY, asyncq.LastDequeueCallback, 0, aborted, se); } else { tcs.TrySetResult(new CAsyncQueue.DeqInfo(messageCount, fileSize, messages, bytes)); } }; Console.WriteLine("Going to dequeue messages ......"); //optionally, add one extra to improve processing concurrency at both client and server sides for better performance and through-output if (!(aq.Dequeue(TEST_QUEUE_KEY, d, 0, aborted, se) && aq.Dequeue(TEST_QUEUE_KEY, d, 0, aborted, se))) { aq.raise(CAsyncQueue.idDequeue); } return(tcs.Task); }
static void DequeueFromServer(CAsyncQueue sq) { uint messages_dequeued = 0; System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); CAsyncQueue.DDequeue d = (aq, messageCount, fileSize, messages, bytes) => { if (messageCount > 0) { //there are more messages left at server queue, we re-send a request to dequeue aq.Dequeue(TEST_QUEUE_KEY, sq.LastDequeueCallback); } else { //set dequeue callback to null and stop dequeuing aq.LastDequeueCallback = null; } }; CAsyncServiceHandler.DOnResultReturned rr = (sender, reqId, q) => { bool processed = false; switch (reqId) { case idMessage: { byte[] utf8 = q.IntenalBuffer; string s = CUQueue.ToString(utf8, (int)q.GetSize()); ++messages_dequeued; } processed = true; break; default: break; } return(processed); }; sq.ResultReturned += rr; Console.WriteLine("Going to dequeue message ......"); sw.Start(); bool ok = sq.Dequeue(TEST_QUEUE_KEY, d); //optionally, add one or two extra to improve processing concurrency at both client and server sides for better performance and throughput ok = sq.Dequeue(TEST_QUEUE_KEY, d); ok = sq.Dequeue(TEST_QUEUE_KEY, d); sq.WaitAll(); sq.ResultReturned -= rr; sw.Stop(); Console.WriteLine(messages_dequeued + " messages dequeued from server within " + sw.ElapsedMilliseconds + " ms"); }
static void TestDequeue(CAsyncQueue aq) { //prepare callback for parsing messages dequeued from server side aq.ResultReturned += (sender, idReq, q) => { bool processed = true; switch (idReq) { case idMessage0: case idMessage1: case idMessage2: Console.Write("message id={0}", idReq); { string name, str; int index; //parse a dequeued message which should be the same as the above enqueued message (two unicode strings and one int) q.Load(out name).Load(out str).Load(out index); Console.WriteLine(", name={0}, str={1}, index={2}", name, str, index); } break; default: processed = false; break; } return(processed); }; //prepare a callback for processing returned result of dequeue request CAsyncQueue.DDequeue d = (messageCount, fileSize, messages, bytes) => { Console.WriteLine("Total message count={0}, queue file size={1}, messages dequeued={2}, message bytes dequeued={3}", messageCount, fileSize, messages, bytes); if (messageCount > 0) { //there are more messages left at server queue, we re-send a request to dequeue aq.Dequeue(TEST_QUEUE_KEY, aq.LastDequeueCallback); } }; Console.WriteLine("Going to dequeue messages ......"); bool ok = aq.Dequeue(TEST_QUEUE_KEY, d); //optionally, add one extra to improve processing concurrency at both client and server sides for better performance and through-output ok = aq.Dequeue(TEST_QUEUE_KEY, d); }
static void TestDequeue(CAsyncQueue aq) { //prepare callback for parsing messages dequeued from server side aq.ResultReturned += (sender, idReq, q) => { bool processed = true; switch (idReq) { case idMessage0: case idMessage1: case idMessage2: Console.Write("message id={0}", idReq); { string name, str; int index; //parse a dequeued message which should be the same as the above enqueued message (two unicode strings and one int) q.Load(out name).Load(out str).Load(out index); Console.WriteLine(", name={0}, str={1}, index={2}", name, str, index); } break; default: processed = false; break; } return processed; }; //prepare a callback for processing returned result of dequeue request CAsyncQueue.DDequeue d = (messageCount, fileSize, messages, bytes) => { Console.WriteLine("Total message count={0}, queue file size={1}, messages dequeued={2}, message bytes dequeued={3}", messageCount, fileSize, messages, bytes); if (messageCount > 0) { //there are more messages left at server queue, we re-send a request to dequeue aq.Dequeue(TEST_QUEUE_KEY, aq.LastDequeueCallback); } }; Console.WriteLine("Going to dequeue messages ......"); bool ok = aq.Dequeue(TEST_QUEUE_KEY, d); //optionally, add one extra to improve processing concurrency at both client and server sides for better performance and through-output ok = aq.Dequeue(TEST_QUEUE_KEY, d); }
static void DequeueFromServer(CAsyncQueue sq) { uint messages_dequeued = 0; System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); CAsyncQueue.DDequeue d = (messageCount, fileSize, messages, bytes) => { if (messageCount > 0) { //there are more messages left at server queue, we re-send a request to dequeue sq.Dequeue(TEST_QUEUE_KEY, sq.LastDequeueCallback); } }; sq.ResultReturned += (sender, reqId, q) => { bool processed = false; switch (reqId) { case idMessage: { byte[] utf8 = q.IntenalBuffer; string s = CUQueue.ToString(utf8, (int)q.GetSize()); ++messages_dequeued; } processed = true; break; default: break; } return processed; }; Console.WriteLine("Going to dequeue message ......"); sw.Start(); bool ok = sq.Dequeue(TEST_QUEUE_KEY, d); //optionally, add one or two extra to improve processing concurrency at both client and server sides for better performance and through-output ok = sq.Dequeue(TEST_QUEUE_KEY, d); ok = sq.Dequeue(TEST_QUEUE_KEY, d); sq.WaitAll(); sw.Stop(); Console.WriteLine(messages_dequeued + " messages dequeued from server within " + sw.ElapsedMilliseconds + " ms"); }