public async Task <ActorProxy <TPrimaryNetContract> > GetActor <TPrimaryNetContract>(ActorKey actorKey)
        {
            NetContractDescription desc = Dispatcher.GetContract <TPrimaryNetContract>();
            var proxyKey = new ActorProxyKey(actorKey, desc.TypeId);

            object proxy;

            if (_proxyCache.TryGetValue(proxyKey, out proxy))
            {
                return((ActorProxy <TPrimaryNetContract>)proxy);
            }

            IOperationExecutor operationExecutor;

            if (actorKey.OwnerNodeId == Id) //local actor
            {
                Actor actor;
                Repository.TryGet(actorKey.LocalActorId, out actor);
                operationExecutor = actor;
            }
            else
            {
                operationExecutor = await GetNodePeer(actorKey.OwnerNodeId);
            }

            return((ActorProxy <TPrimaryNetContract>)_proxyCache.GetOrAdd(proxyKey,
                                                                          (actorId) => new ActorProxy <TPrimaryNetContract>(
                                                                              (TPrimaryNetContract)(object)Dispatcher.CreateProxy(Dispatcher.GetContractId(typeof(TPrimaryNetContract)), MessageFactory, operationExecutor, actorKey),
                                                                              actorKey)));
        }
        public TNetContract GetProxy <TNetContract>(uint?localActorId = null) where TNetContract : class
        {
            NetContractDescription contractDesc = Dispatcher.GetContract <TNetContract>();
            var      proxyKey = new ActorProxyKey(new ActorKey(0, localActorId ?? 0), contractDesc.TypeId);
            NetProxy proxy;

            if (!_proxyCache.TryGetValue(proxyKey, out proxy))
            {
                proxy = Dispatcher.CreateProxy(contractDesc.TypeId, MsgFactory, this, localActorId.HasValue ? proxyKey.ActorKey : (ActorKey?)null);
                _proxyCache.Add(proxyKey, proxy);
            }

            return((TNetContract)(object)proxy);
        }
        public async Task <TNetContract> GetProxy <TNetContract>(uint?localActorId = null)
        {
            await Node.Fiber.ContinueOn().ConfigureAwait(false);

            NetContractDescription contractDesc = Node.Dispatcher.GetContract <TNetContract>();
            var      proxyKey = new ActorProxyKey(new ActorKey(0, localActorId ?? 0), contractDesc.TypeId);
            NetProxy proxy;

            if (!_proxyCache.TryGetValue(proxyKey, out proxy))
            {
                proxy = Node.Dispatcher.CreateProxy(contractDesc.TypeId, MessageFactory, this, localActorId.HasValue ? proxyKey.ActorKey : (ActorKey?)null);
                _proxyCache.Add(proxyKey, proxy);
            }

            return((TNetContract)(object)proxy);
        }