Controller GetOrCreateController(Link link)
        {
            Controller controller;
            lock (this.SyncRoot)
            {
                if (!this.controllers.TryGetValue(link.Session.Connection, out controller))
                {
                    Session session = new Session(link.Session.Connection);
                    controller = new Controller(session);
                    controller.Closed += this.OnControllerClosed;
                    this.controllers.Add(link.Session.Connection, controller);
                }
            }

            return controller;
        }
            public async Task<byte[]> EnlistAsync(Link link)
            {
                if (this.txnid != null)
                {
                    return this.txnid;
                }

                lock (this.syncRoot)
                {
                    if (this.declareTask == null)
                    {
                        this.controller = this.owner.GetOrCreateController(link);
                        this.declareTask = this.controller.DeclareAsync();
                    }
                }

                return this.txnid = await this.declareTask;
            }