/// <summary> /// Put the response item objects into the storage. /// </summary> /// <param name="responses">A list of response objects</param> /// <param name="putResponseCallback">the callback function that will be called once the async operation finish or exception raise.</param> /// <param name="callbackState">the state object for the callback.</param> public void PutResponsesAsync(IEnumerable <BrokerQueueItem> responses, PutResponseCallback putResponseCallback, object callbackState) { int responseCount = 0; int faultResponseCount = 0; foreach (BrokerQueueItem response in responses) { lock (this.lockResponseQueueField) { this.responseQueueField.Enqueue(response); Interlocked.Increment(ref this.responseCountField); } response.PeerItem.Dispose(); response.PeerItem = null; if (response.Message.IsFault) { faultResponseCount++; } responseCount++; } Interlocked.Add(ref this.failedRequestCountField, faultResponseCount); long remainingRequestCount = Interlocked.Add(ref this.requestCountField, -(responseCount)); bool isLastResponse = this.EOMReceived && (remainingRequestCount == 0); PutResponseComplete(responseCount, faultResponseCount, isLastResponse, putResponseCallback, callbackState); }
/// <summary> /// Put on response item into persistence /// </summary> /// <param name="response">the response item to be persisted</param> /// <param name="putResponseCallback">the callback function that will be called once the async operation finish or exception raise.</param> /// <param name="callbackState">the state object for the callback.</param> public void PutResponseAsync(BrokerQueueItem response, PutResponseCallback putResponseCallback, object callbackState) { bool isFaultResponse = response.Message.IsFault; lock (this.lockResponseQueueField) { this.responseQueueField.Enqueue(response); Interlocked.Increment(ref this.responseCountField); } response.PeerItem.Dispose(); response.PeerItem = null; if (isFaultResponse) { Interlocked.Increment(ref this.failedRequestCountField); } bool isLastResponse = (Interlocked.Decrement(ref this.requestCountField) == 0); PutResponseComplete(1, isFaultResponse ? 1 : 0, isLastResponse, putResponseCallback, callbackState); }
/// <summary> /// the putting response complete thread proc /// </summary> /// <param name="state">the thread pool callback state</param> private static void PutResponseComplete(int responseCount, int faultResponseCount, bool isLastResponse, PutResponseCallback putResponseCallback, object callbackState) { if (putResponseCallback == null) { return; } try { putResponseCallback(null, responseCount, faultResponseCount, isLastResponse, null, callbackState); } catch (Exception e) { BrokerTracing.TraceError("[MemoryPersist] .PutResponseComplete: callback failed, Exception:{0}.", e.ToString()); } }