// parameters:
        //      strName 连接的名字。如果要针对同一 dp2mserver 使用多根连接,可以用名字区分它们。如果不想区分,可以使用空
        //      autoConnect 是否自动连接
        //      waitConnecting  是否等待连接完成后再返回?
        public MessageConnection GetConnection(string url,
                                               string remoteName,
                                               bool autoConnect    = true,
                                               bool waitConnecting = true)
        {
            MessageConnection connection = null;

            foreach (MessageConnection current_connection in _connections)
            {
                if (current_connection.ServerUrl == url && current_connection.Name == remoteName)
                {
                    connection = current_connection;
                    goto FOUND;
                }
            }

            connection           = new MessageConnection();
            connection.ServerUrl = url;
            connection.Name      = remoteName;
            connection.Container = this;
            this._connections.Add(connection);

FOUND:
            if (autoConnect && connection.IsConnected == false)
            {
                Task task = connection.ConnectAsync(url);

                if (waitConnecting)
                {
                    task.Wait();
                }
            }

            return(connection);
        }
Esempio n. 2
0
        // parameters:
        //      strName 连接的名字。如果要针对同一 dp2mserver 使用多根连接,可以用名字区分它们。如果不想区分,可以使用空
        public Task <MessageConnection> GetConnectionAsync(string url,
                                                           string strName,
                                                           bool autoConnect = true)
        {
            MessageConnection connection = null;

            foreach (MessageConnection current_connection in _connections)
            {
                if (current_connection.ServerUrl == url && current_connection.Name == strName)
                {
                    connection = current_connection;
                    goto FOUND;
                }
            }

            connection           = new MessageConnection();
            connection.ServerUrl = url;
            connection.Name      = strName;
            connection.Container = this;
            this._connections.Add(connection);

FOUND:
            if (autoConnect && connection.IsConnected == false)
            {
                Task <MessageConnection> task = new Task <MessageConnection>(() =>
                {
                    connection.ConnectAsync(url).Wait();
                    return(connection);
                });
                task.Start();
                return(task);
            }

            {
                var task = new Task <MessageConnection>(() =>
                {
                    return(connection);
                });
                task.Start();
                return(task);
            }
        }
        public async Task <MessageConnection> GetConnectionAsyncLite(string url,
                                                                     string strName,
                                                                     bool autoConnect = true,
                                                                     bool incUseCount = false)
        {
            MessageConnection connection = null;

#if NO
            this._lock.EnterUpgradeableReadLock();
            try
            {
                foreach (MessageConnection current_connection in _connections)
                {
                    if (current_connection.ServerUrl == url && current_connection.Name == strName)
                    {
                        connection          = current_connection;
                        connection.LastTime = DateTime.Now;
                        goto FOUND;
                    }
                }

                connection           = new MessageConnection();
                connection.ServerUrl = url;
                connection.Name      = strName;
                connection.LastTime  = DateTime.Now;
                connection.Container = this;
                this._lock.EnterWriteLock();
                try
                {
                    this._connections.Add(connection);
                }
                finally
                {
                    this._lock.ExitWriteLock();
                }
            }
            finally
            {
                this._lock.ExitUpgradeableReadLock();
            }
#endif
            bool newCreate = false;
            connection = PeekConnection(url,
                                        strName,
                                        incUseCount,
                                        out newCreate);

            if (newCreate == true)
            {
                // 触发 Created 事件
                this.TriggerCreated(connection, new ConnectionCreatedEventArgs());
            }

            // FOUND:
            if (autoConnect && connection.ConnectState == Microsoft.AspNet.SignalR.Client.ConnectionState.Disconnected)
            {
                MessageResult result = await connection.ConnectAsync();

                if (result.Value == -1)
                {
                    throw new MessageException(result.String, connection.UserName, result.ErrorInfo);
                }
                return(connection);
            }

            return(connection);
        }
        // parameters:
        //      strName 连接的名字。如果要针对同一 dp2mserver 使用多根连接,可以用名字区分它们。如果不想区分,可以使用空
        public Task <MessageConnection> GetConnectionTaskAsync(string url,
                                                               string strName,
                                                               bool autoConnect = true,
                                                               bool incUseCount = false)
        {
            MessageConnection connection = null;

#if NO
            this._lock.EnterUpgradeableReadLock();
            try
            {
                foreach (MessageConnection current_connection in _connections)
                {
                    if (current_connection.ServerUrl == url && current_connection.Name == strName)
                    {
                        connection          = current_connection;
                        connection.LastTime = DateTime.Now;
                        goto FOUND;
                    }
                }

                connection           = new MessageConnection();
                connection.ServerUrl = url;
                connection.Name      = strName;
                connection.LastTime  = DateTime.Now;
                connection.Container = this;
                this._lock.EnterWriteLock();
                try
                {
                    this._connections.Add(connection);
                }
                finally
                {
                    this._lock.ExitWriteLock();
                }
            }
            finally
            {
                this._lock.ExitUpgradeableReadLock();
            }
#endif
            bool newCreate = false;
            connection = PeekConnection(url,
                                        strName,
                                        incUseCount,
                                        out newCreate);

            if (newCreate == true)
            {
                // 触发 Created 事件
                this.TriggerCreated(connection, new ConnectionCreatedEventArgs());
            }

            // FOUND:
#if NO
            LoginEventArgs e = new LoginEventArgs();
            e.ServerUrl = url;
            e.Name      = strName;
            LoginEventHandler handler = this.Login;
            if (handler != null)
            {
                handler(connection, e); // TODO: 是否在真正连接前再触发?
            }
            if (string.IsNullOrEmpty(e.ErrorInfo) == false)
            {
                throw new Exception(e.ErrorInfo);
            }

            connection.UserName   = e.UserName;
            connection.Password   = e.Password;
            connection.Parameters = e.Parameters;
#endif

            if (autoConnect && connection.ConnectState == Microsoft.AspNet.SignalR.Client.ConnectionState.Disconnected)
            {
                return(Task.Run <MessageConnection>(async() =>
                {
                    // TODO: 建议抛出原有 Exception
                    MessageResult result = await connection.ConnectAsync();
                    if (result.Value == -1)
                    {
                        throw new MessageException(result.String, connection.UserName, result.ErrorInfo);
                    }
                    return connection;
                }));

#if NO
                Task <MessageConnection> task = new Task <MessageConnection>(async() =>
                {
                    // TODO: 建议抛出原有 Exception
                    MessageResult result = await connection.ConnectAsync();
                    if (result.Value == -1)
                    {
                        throw new Exception(result.ErrorInfo);
                    }
                    return(connection);
                });
                task.Start();
                return(task);
#endif
            }

#if NO
            {
                var task = new Task <MessageConnection>(() =>
                {
                    return(connection);
                });
                task.Start();
                return(task);
            }
#endif
            return(Task.Run(() =>
            {
                return connection;
            }));
        }