gpt4 book ai didi

c# - 打开 MySqlConnection 时没有抛出异常?

转载 作者:行者123 更新时间:2023-12-03 06:26:21 27 4
gpt4 key购买 nike

我刚开始使用异步和任务,我的代码已停止处理。当我有一个传入的网络数据包并且我尝试与数据包处理程序内的数据库进行通信时,就会发生这种情况。

public class ClientConnectedPacket : IClientPacket
{
private readonly EntityFactory _entityFactory;

public ClientConnectedPacket(EntityFactory entityFactory)
{
_entityFactory= entityFactory;
}

public async Task Handle(NetworkClient client, ClientPacketReader reader)
{
client.Entity = await _entityFactory.CreateInstanceAsync( reader.GetValueByKey("unique_device_id"));

// this Console.WriteLine never gets reached
Console.WriteLine($"Client [{reader.GetValueByKey("unique_device_id")}] has connected");
}
}

从异步任务中调用 Handle 方法
if (_packetRepository.TryGetPacketByName(packetName, out var packet))
{
await packet.Handle(this, new ClientPacketReader(packetName, packetData));
}
else
{
Console.WriteLine("Unknown packet: " + packetName);
}

这是我认为导致问题的方法
public async Task<Entity> CreateInstanceAsync(string uniqueId)
{
await using (var dbConnection = _databaseProvider.GetConnection())
{
dbConnection.SetQuery("SELECT COUNT(NULL) FROM `entities` WHERE `unique_id` = @uniqueId");
dbConnection.AddParameter("uniqueId", uniqueId);

var row = await dbConnection.ExecuteRowAsync();

if (row != null)
{
return new Entity(uniqueId, false);
}
}

return new Entity(uniqueId,true);
}

DatabaseProvider 的 GetConnection 方法:
public DatabaseConnection GetConnection()
{
var connection = new MySqlConnection(_connectionString);
var command = connection.CreateCommand();

return new DatabaseConnection(_logFactory.GetLogger(), connection, command);
}

DatabaseConnection 的构造函数:
public DatabaseConnection(ILogger logger, MySqlConnection connection, MySqlCommand command)
{
_logger = logger;

_connection = connection;
_command = command;

_connection.Open();
}

当我注释掉这一行时,它到达 Console.WriteLine
_connection.Open();

最佳答案

我运行了一个 POC 项目,在 .NET Core 3.1 控制台应用程序上使用 MySql.Data 8.0.19 和 MySqlConnector 0.63.2 旋转 100 个并行任务。我在每个任务的上下文中创建、打开和处理连接。两个提供程序都运行完成,没有错误。

具体是 MySql.Data 查询运行 同步尽管库提供了异步方法签名,例如ExecuteReaderAsync() 或 ExecuteScalarAsync(),而 MySqlConnector 真正运行 异步 .

你可能会遇到:

  • 与 mysql 提供程序无关的死锁情况
  • 没有正确处理任务中的异常(您可以检查与任务相关的聚合异常并监视 mysql 数据库日志)
  • 如果您使用 MySql.Data 运行大量并行任务,因为它同步执行
  • 当您认为它不起作用时,您的执行仍然被阻止(不返回结果)

    关于c# - 打开 MySqlConnection 时没有抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61081569/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com