diff --git a/src/MySqlConnector/IOKind.cs b/src/MySqlConnector/IOKind.cs
new file mode 100644
index 000000000..52e503a90
--- /dev/null
+++ b/src/MySqlConnector/IOKind.cs
@@ -0,0 +1,19 @@
+namespace MySql.Data
+{
+ ///
+ /// Specifies whether to perform synchronous or asynchronous I/O.
+ ///
+ internal enum IOKind
+ {
+ ///
+ /// Use synchronous I/O.
+ ///
+ Synchronous,
+
+ ///
+ /// Use asynchronous I/O.
+ ///
+
+ Asynchronous,
+ }
+}
diff --git a/src/MySqlConnector/MySqlClient/ConnectionPool.cs b/src/MySqlConnector/MySqlClient/ConnectionPool.cs
index 1c5a38e99..24a0eb547 100644
--- a/src/MySqlConnector/MySqlClient/ConnectionPool.cs
+++ b/src/MySqlConnector/MySqlClient/ConnectionPool.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Collections.Concurrent;
+using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
@@ -9,8 +8,7 @@ namespace MySql.Data.MySqlClient
{
internal sealed class ConnectionPool
{
-
- public async Task GetSessionAsync(CancellationToken cancellationToken)
+ public async Task GetSessionAsync(IOKind ioKind, CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
@@ -26,17 +24,17 @@ public async Task GetSessionAsync(CancellationToken cancellationTo
// check for a pooled session
if (m_sessions.TryDequeue(out session))
{
- if (!await session.TryPingAsync(cancellationToken).ConfigureAwait(false))
+ if (!await session.TryPingAsync(ioKind, cancellationToken).ConfigureAwait(false))
{
// session is not valid
- await session.DisposeAsync(cancellationToken).ConfigureAwait(false);
+ await session.DisposeAsync(ioKind, cancellationToken).ConfigureAwait(false);
}
else
{
// session is valid, reset if supported
if (m_resetConnections)
{
- await session.ResetConnectionAsync(m_userId, m_password, m_database, cancellationToken).ConfigureAwait(false);
+ await session.ResetConnectionAsync(m_userId, m_password, m_database, ioKind, cancellationToken).ConfigureAwait(false);
}
// pooled session is ready to be used; return it
return session;
@@ -44,7 +42,7 @@ public async Task GetSessionAsync(CancellationToken cancellationTo
}
session = new MySqlSession(this);
- await session.ConnectAsync(m_servers, m_port, m_userId, m_password, m_database, m_connectionTimeout, cancellationToken).ConfigureAwait(false);
+ await session.ConnectAsync(m_servers, m_port, m_userId, m_password, m_database, m_connectionTimeout, ioKind, cancellationToken).ConfigureAwait(false);
return session;
}
catch
@@ -66,7 +64,7 @@ public void Return(MySqlSession session)
}
}
- public async Task ClearAsync(CancellationToken cancellationToken)
+ public async Task ClearAsync(IOKind ioKind, CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
try
@@ -84,7 +82,7 @@ public async Task ClearAsync(CancellationToken cancellationToken)
MySqlSession session;
while (m_sessions.TryDequeue(out session))
{
- tasks.Add(session.DisposeAsync(cancellationToken));
+ tasks.Add(session.DisposeAsync(ioKind, cancellationToken));
}
if (tasks.Count > 0)
{
@@ -118,12 +116,12 @@ public static ConnectionPool GetPool(MySqlConnectionStringBuilder csb)
return pool;
}
- public static async Task ClearPoolsAsync(CancellationToken cancellationToken)
+ public static async Task ClearPoolsAsync(IOKind ioKind, CancellationToken cancellationToken)
{
var pools = new List(s_pools.Values);
foreach (var pool in pools)
- await pool.ClearAsync(cancellationToken).ConfigureAwait(false);
+ await pool.ClearAsync(ioKind, cancellationToken).ConfigureAwait(false);
}
private ConnectionPool(IEnumerable servers, int port, string userId, string password, string database, int connectionTimeout,
diff --git a/src/MySqlConnector/MySqlClient/MySqlCommand.cs b/src/MySqlConnector/MySqlClient/MySqlCommand.cs
index 218b5b58f..58bbdcf8a 100644
--- a/src/MySqlConnector/MySqlClient/MySqlCommand.cs
+++ b/src/MySqlConnector/MySqlClient/MySqlCommand.cs
@@ -53,10 +53,10 @@ public override void Cancel()
}
public override int ExecuteNonQuery()
- => ExecuteNonQueryAsync(CancellationToken.None).GetAwaiter().GetResult();
+ => ExecuteNonQueryAsync(IOKind.Synchronous, CancellationToken.None).GetAwaiter().GetResult();
public override object ExecuteScalar()
- => ExecuteScalarAsync(CancellationToken.None).GetAwaiter().GetResult();
+ => ExecuteScalarAsync(IOKind.Synchronous, CancellationToken.None).GetAwaiter().GetResult();
public override void Prepare()
{
@@ -103,37 +103,46 @@ protected override DbParameter CreateDbParameter()
}
protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior)
- => ExecuteDbDataReaderAsync(behavior, CancellationToken.None).GetAwaiter().GetResult();
+ => ExecuteReaderAsync(behavior, IOKind.Synchronous, CancellationToken.None).GetAwaiter().GetResult();
- public override async Task ExecuteNonQueryAsync(CancellationToken cancellationToken)
+ public override Task ExecuteNonQueryAsync(CancellationToken cancellationToken) =>
+ ExecuteNonQueryAsync(IOKind.Asynchronous, cancellationToken);
+
+ internal async Task ExecuteNonQueryAsync(IOKind ioKind, CancellationToken cancellationToken)
{
- using (var reader = await ExecuteReaderAsync(cancellationToken).ConfigureAwait(false))
+ using (var reader = (MySqlDataReader) await ExecuteReaderAsync(CommandBehavior.Default, ioKind, cancellationToken).ConfigureAwait(false))
{
do
{
- while (await reader.ReadAsync(cancellationToken).ConfigureAwait(false))
+ while (await reader.ReadAsync(ioKind, cancellationToken).ConfigureAwait(false))
{
}
- } while (await reader.NextResultAsync(cancellationToken).ConfigureAwait(false));
+ } while (await reader.NextResultAsync(ioKind, cancellationToken).ConfigureAwait(false));
return reader.RecordsAffected;
}
}
- public override async Task