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(); }
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(); } }