我刚开始使用异步和任务,我的代码已停止处理。当我有一个传入的网络数据包并且我尝试与数据包处理程序内的数据库进行通信时,就会发生这种情况。
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");
}
}
Run Code Online (Sandbox Code Playgroud)
从异步任务中调用 Handle 方法
if (_packetRepository.TryGetPacketByName(packetName, out var packet))
{
await packet.Handle(this, new ClientPacketReader(packetName, packetData));
}
else
{
Console.WriteLine("Unknown packet: " + packetName);
}
Run Code Online (Sandbox Code Playgroud)
这是我认为导致问题的方法
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);
}
Run Code Online (Sandbox Code Playgroud)
DatabaseProvider 的 GetConnection 方法:
public DatabaseConnection GetConnection()
{
var connection = new MySqlConnection(_connectionString);
var command = connection.CreateCommand();
return new DatabaseConnection(_logFactory.GetLogger(), connection, command);
}
Run Code Online (Sandbox Code Playgroud)
DatabaseConnection 的构造函数:
public DatabaseConnection(ILogger logger, MySqlConnection connection, MySqlCommand command)
{
_logger = logger;
_connection = connection;
_command = command;
_connection.Open();
}
Run Code Online (Sandbox Code Playgroud)
当我注释掉这一行时,它到达 Console.WriteLine
_connection.Open();
Run Code Online (Sandbox Code Playgroud)
MySQL的多线程必须使用独立连接。鉴于此,多线程不是 MySQL 问题,而是客户端语言(问题中的 C#)的问题。
也就是说,构建线程而不考虑 MySQL,然后在每个需要执行查询的线程中创建一个连接。如果您需要在线程之间传递数据,这将由您负责。
我通常发现优化查询可以消除应用程序多线程的诱惑。
归档时间: |
|
查看次数: |
266 次 |
最近记录: |