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