Ejemplo n.º 1
0
        public Message ExecuteRequest(Uri uri, Message message)
        {
            ThreadlessRequestContext context;
            bool useWaitHandle = false;
            Func <Uri, ThreadlessRequestContextQueue> addAction = key =>
            {
                useWaitHandle = true;
                return(new ThreadlessRequestContextQueue()
                {
                    UseWaitHandle = true
                });
            };
            ThreadlessRequestContextQueue queue = requestsByUri.GetOrAdd(uri, addAction);

            if (useWaitHandle)
            {
                bool hasRequest = queue.WaitHandle.WaitOne(TimeSpan.FromMinutes(1));
                queue.UseWaitHandle = false;
                if (!hasRequest)
                {
                    throw new CommunicationObjectFaultedException();
                }
            }

            if (queue.TryDequeue(out context))
            {
                message.Headers.To = uri;
                return(context.ExecuteRequest(message));
            }

            throw new CommunicationObjectFaultedException();
        }
Ejemplo n.º 2
0
        public void RegisterRequestContext(Uri uri, ThreadlessRequestContext context)
        {
            Func <Uri, ThreadlessRequestContextQueue> addAction = key =>
            {
                ThreadlessRequestContextQueue queue = new ThreadlessRequestContextQueue();
                queue.Enqueue(context);
                return(queue);
            };
            ThreadlessRequestContextQueue requestQueue = null;
            Func <Uri, ThreadlessRequestContextQueue, ThreadlessRequestContextQueue> updateAction = (key, queue) =>
            {
                queue.Enqueue(context);
                requestQueue = queue;
                return(queue);
            };

            requestsByUri.AddOrUpdate(uri, addAction, updateAction);
            if (requestQueue != null && requestQueue.UseWaitHandle)
            {
                requestQueue.WaitHandle.Set();
            }
        }