示例#1
0
    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);
    }
示例#2
0
    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");
    }
示例#3
0
    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);
    }