public Worker NextAvailableWorker()
        {
            try
            {
                Message availableWorker;

                if (!storageLock.TryEnterReadLock(MaxTimeToWaitForAvailableWorker))
                {
                    return(null);
                }

                try
                {
                    if (unitOfWork.HasActiveTransaction())
                    {
                        availableWorker = storageQueue.Receive(MaxTimeToWaitForAvailableWorker, unitOfWork.Transaction);
                    }
                    else
                    {
                        availableWorker = storageQueue.Receive(MaxTimeToWaitForAvailableWorker, MessageQueueTransactionType.Automatic);
                    }
                }
                finally
                {
                    storageLock.ExitReadLock();
                }

                if (availableWorker == null)
                {
                    return(null);
                }

                var    address = MsmqUtilities.GetIndependentAddressForQueue(availableWorker.ResponseQueue);
                string registeredWorkerSessionId;
                var    sessionId = availableWorker.Label;

                if (String.IsNullOrEmpty(sessionId)) //Old worker
                {
                    Logger.InfoFormat("Using an old version Worker at '{0}'.", address);
                    return(new Worker(address, sessionId));
                }

                if (!registeredWorkerAddresses.TryGetValue(address, out registeredWorkerSessionId))
                {
                    // Distributor could have been restarted, hence the reason we do not have the worker registered.
                    registeredWorkerAddresses[address] = sessionId;

                    Logger.InfoFormat("Worker at '{0}' has been re-registered with distributor.", address);
                }

                return(new Worker(address, sessionId));
            }
            catch (MessageQueueException e)
            {
                Logger.InfoFormat("NextAvailableWorker Exception", e);
                return(null);
            }
        }