コード例 #1
0
        object Invoke(ITransport transport, string name, object[] parameters, bool isReturn)
        {
            EventInvokePacket packet = new EventInvokePacket();

            packet.state      = EventInvokePacket.State.Invoke;
            packet.eventName  = name;
            packet.parameters = parameters;
            packet.randomID   = isReturn ? new Random().Next() : -1;
            transport.Send(packet);
            if (isReturn)
            {
                waitingResultThreads.Add(packet.randomID, Thread.CurrentThread);
                try
                {
                    //Thread.Sleep(Timeout.Infinite);
                    Thread.Sleep(100);
                }
                catch (Exception)
                {
                    EventInvokePacket returnPacket = returnValuePacketPool[packet.randomID];
                    returnValuePacketPool.Remove(returnPacket.randomID);
                    return(returnPacket.returnValue);
                }
            }
            return(null);
        }
コード例 #2
0
 internal void InvokeEvent(ITransport transport, EventInvokePacket packet)
 {
     if (packet.state == EventInvokePacket.State.Invoke)
     {
         if (noReturnEventList.ContainsKey(packet.eventName))
         {
             noReturnEventList[packet.eventName](transport, packet.parameters);
             return;
         }
         if (returnEventList.ContainsKey(packet.eventName))
         {
             object returnValue = returnEventList[packet.eventName](transport, packet.parameters);
             packet.state       = EventInvokePacket.State.Return;
             packet.parameters  = null;
             packet.returnValue = returnValue;
             transport.Send(packet);
             return;
         }
         packet.parameters = null;
         packet.state      = EventInvokePacket.State.NoEvent;
         transport.Send(packet);
     }
     else if (packet.state == EventInvokePacket.State.Return)
     {
         returnValuePacketPool.Add(packet.randomID, packet);
         waitingResultThreads[packet.randomID].Interrupt();
         waitingResultThreads.Remove(packet.randomID);
     }
 }