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