public IAsyncResult BeginPublish(int timeout)
{
// do not publish if reconnecting.
if (m_reconnecting)
{
Utils.Trace("Published skipped due to reconnect");
return null;
}
SubscriptionAcknowledgementCollection acknowledgementsToSend = null;
// collect the current set if acknowledgements.
lock (SyncRoot)
{
acknowledgementsToSend = m_acknowledgementsToSend;
m_acknowledgementsToSend = new SubscriptionAcknowledgementCollection();
foreach (var toSend in acknowledgementsToSend)
{
if (m_latestAcknowledgementsSent.ContainsKey(toSend.SubscriptionId))
{
m_latestAcknowledgementsSent[toSend.SubscriptionId] = toSend.SequenceNumber;
}
else
{
m_latestAcknowledgementsSent.Add(toSend.SubscriptionId, toSend.SequenceNumber);
}
}
}
// send publish request.
RequestHeader requestHeader = new RequestHeader();
// ensure the publish request is discarded before the timeout occurs to ensure the channel is dropped.
requestHeader.TimeoutHint = (uint)OperationTimeout/2;
requestHeader.ReturnDiagnostics = (uint)(int)ReturnDiagnostics;
requestHeader.RequestHandle = Utils.IncrementIdentifier(ref m_publishCounter);
AsyncRequestState state = new AsyncRequestState();
state.RequestTypeId = DataTypes.PublishRequest;
state.RequestId = requestHeader.RequestHandle;
state.Timestamp = DateTime.UtcNow;
try
{
IAsyncResult result = BeginPublish(
requestHeader,
acknowledgementsToSend,
OnPublishComplete,
new object[] { SessionId, acknowledgementsToSend, requestHeader });
AsyncRequestStarted(result, requestHeader.RequestHandle, DataTypes.PublishRequest);
// Utils.Trace("PUBLISH #{0} SENT", requestHeader.RequestHandle);
return result;
}
catch (Exception e)
{
Utils.Trace(e, "Unexpected error sending publish request.");
return null;
}
}