К сожалению, MySQL Connector не предлагает истинных асинхронных методов. Его Begin/End
методы подделкой асинхронное выполнение по wrapping the synchronous version в теме:
public IAsyncResult BeginExecuteReader(CommandBehavior behavior)
{
if (caller != null)
Throw(new MySqlException(Resources.UnableToStartSecondAsyncOp));
caller = new AsyncDelegate(AsyncExecuteWrapper);
asyncResult = caller.BeginInvoke(1, behavior, null, null);
return asyncResult;
}
AsyncExecuteWrapper, где находится:
internal object AsyncExecuteWrapper(int type, CommandBehavior behavior)
{
thrownException = null;
try
{
if (type == 1)
return ExecuteReader(behavior);
return ExecuteNonQuery();
}
catch (Exception ex)
{
thrownException = ex;
}
return null;
}
В результате, они тратят впустую поток ожидает ответа. Исправлена ошибка была подана три года назад but never got a real answer
Вот почему эта альтернатива MySQLConnector был создан проект, который обеспечивает истинные асинхронные операции, а также поддержку .NET Core, например this method
internal async Task<int> ExecuteNonQueryAsync(IOBehavior ioBehavior, CancellationToken cancellationToken)
{
using (var reader = (MySqlDataReader) await ExecuteReaderAsync(CommandBehavior.Default, ioBehavior, cancellationToken).ConfigureAwait(false))
{
do
{
while (await reader.ReadAsync(ioBehavior, cancellationToken).ConfigureAwait(false))
{
}
} while (await reader.NextResultAsync(ioBehavior, cancellationToken).ConfigureAwait(false));
return reader.RecordsAffected;
}
}
Вы увидите, что ReadAsync также надлежащий асинхронный метод
Разница значительна, особенно в веб-приложениях, так как она позволяет использовать экземпляр VM меньшего размера для сервера того же трафика. Или же виртуальная машина может увеличить трафик сервера. В любом случае разница в ценах реальна.
Это происходит потому, что асинхронные сетевые операции фактически выгружаются на драйвер или хост. Нить из пула потоков ввода-вывода используется только тогда, когда сетевой драйвер передает ответ на приложение. В случае паравиртуализации разгрузка может пройти весь путь до хоста.
Поддельные синхронные операции с другой стороны блока и могут даже привести к оживленному оживлению. Это связано с тем, что примитивы синхронизации предназначены для использования ... Синхронизация доступа к общим ресурсам. Приостановка потока расходов, поэтому ожидание на примитиве сначала начинается с Spinlock и только приостанавливает поток через определенное время.
Вот почему веб-приложения, которые не принимают во внимание асинхронность может в конечном итоге сжигание много CPU во время ожидания для удаленных ответов
Не беспокойтесь о том, что код не ваше. Он будет работать так, как он работает; вы не контролируете его. Если это действительно проблема, найдите другую стороннюю библиотеку. –
Но это мой код. – Fuselight
Я имею в виду код, который вы написали. Вы явно используете потоки? Я не имею в виду код, который вы используете, например, код рамки или сторонний код. –