public async Task <T> GetResultAsync <T>(Func <ClickHouseConnection, Task <T> > func) { var c = _conn.GetConnection(); try { if (c.State.Equals(ConnectionState.Closed) || c.State.Equals(ConnectionState.Broken)) { c.Open(); } else if (c.State.Equals(ConnectionState.Connecting) || c.State.Equals(ConnectionState.Executing) || c.State.Equals(ConnectionState.Fetching)) { while (!c.State.Equals(ConnectionState.Open)) { c = _conn.SwapConnection(c); if (c.State.Equals(ConnectionState.Closed) || c.State.Equals(ConnectionState.Broken)) { c.Open(); } } } return(await func(c)); } finally { c.Release(); } }