コード例 #1
0
        /// <summary>
        /// Read test thread procedure.
        /// </summary>
        /// <param name="data">AutoResetEvent instance to signal when complete.</param>
        internal void ReadThreadProc(object data)
        {
            AutoResetEvent evt = (AutoResetEvent)data;

            // Create a queue client.
            HttpQueueClient <T> qc = new HttpQueueClient <T>(new Uri(serviceUri), c_ListenerName);

            // Check that cancellation isn't requested and we are not at the requested count.
            while ((_requestCount < _maxRequests) && (false == _cancellationToken.IsCancellationRequested))
            {
                try
                {
                    Stopwatch swCall = Stopwatch.StartNew();
                    IEnumerable <QueueItem <T> > items = qc.DequeueAsync(_batchSize, cancellationToken: _cancellationToken).GetAwaiter().GetResult();
                    swCall.Stop();

                    // Track the call time.
                    TrackCallData(swCall.ElapsedMilliseconds);

                    // Build the list of leases to release.
                    List <PopReceipt> keys = new List <PopReceipt>(_batchSize);
                    foreach (QueueItem <T> item in items)
                    {
                        keys.Add(item.Key);
                    }

                    // Were any items returned?
                    if (0 == keys.Count)
                    {
                        Interlocked.Increment(ref _notFoundOrConflict);
                    }
                    else // Release the held leases for each item.
                    {
                        IEnumerable <bool> results = qc.ReleaseLeaseAsync(keys, _cancellationToken).GetAwaiter().GetResult();
                        foreach (bool bResult in results)
                        {
                            if (bResult)
                            {
                                Interlocked.Increment(ref _successfulRequests);
                            }
                        }
                    }
                }
                catch (TimeoutException) { Interlocked.Increment(ref _timedoutRequests); }
                catch (Exception ex) { Console.WriteLine($"ReadTest.ReadThreadProc exception {ex.GetType().Name}: {ex.Message}, {ex.StackTrace}"); }

                // Increment the request count.
                Interlocked.Increment(ref _requestCount);
                if (0 == _requestCount % 100)
                {
                    Console.Write("\rTotal Read: {0,-15:N0}", _requestCount);
                }
            }

            // Signal this thread has completed.
            evt.Set();
        }
コード例 #2
0
        /// <summary>
        /// Releases the lease for each of the items in the list.
        /// </summary>
        /// <param name="client">QueueClient instance.</param>
        /// <param name="items">Items to release leases.</param>
        private async Task ReleaseLeasesAsync(HttpQueueClient <Item> client, IEnumerable <QueueItem <Item> > items)
        {
            // Release the lease.
            var results = await client.ReleaseLeaseAsync(KeyArrayFromItems(items), CancellationToken.None).ConfigureAwait(false);

            foreach (bool b in results)
            {
                Assert.IsTrue(b);
            }
        }