예제 #1
0
 private void ReadLoop()
 {
     for (;;)
     {
         var        callId = streamHandler.ReadUInt16();
         RemoteCall newCall;
         while (newCalls.TryTake(out newCall))
         {
             Stack <RemoteCall> stack;
             if (!threadCallStack.TryGetValue(newCall.localThreadId, out stack))
             {
                 stack = new Stack <RemoteCall>();
                 threadCallStack.Add(newCall.localThreadId, stack);
             }
             stack.Push(newCall);
         }
         if (callId == ushort.MaxValue)
         {
             var threadId = streamHandler.ReadInt32();
             var rc       = threadCallStack[threadId].Pop();
             rc.ReadResponse(streamHandler);
             lock (rc) {
                 Monitor.PulseAll(rc);
             }
         }
         else
         {
             var call = RemoteCallFactory.ForCallId((RemoteCallId)callId);
             call.ReadRequest(streamHandler);
             if (call.localThreadId != 0)
             {
                 var rc = threadCallStack[call.localThreadId].Peek();
                 rc.nextCall = call;
                 lock (rc) {
                     Monitor.PulseAll(rc);
                 }
             }
             else
             {
                 WorkerPool.EnqueueTask(() => {
                     call.Execute(this);
                     if (!call.returnImmediately)
                     {
                         Write(call.WriteResponse);
                     }
                 });
             }
         }
     }
 }
 private void ReadLoop()
 {
     for (; ;)
     {
         var callId = streamHandler.ReadUInt16();
         if (callId == ushort.MaxValue)
         {
             var threadId = streamHandler.ReadInt32();
             var call     = callStack.Pop(threadId);
             call.ReadResponse(streamHandler);
         }
         else
         {
             var call = RemoteCallFactory.ForCallId((RemoteCallId)callId);
             call.ReadRequest(this);
         }
     }
 }