Ich fange gerade mit Async und Task an und mein Code wurde nicht mehr verarbeitet. Es passiert, wenn ich ein eingehendes Netzwerkpaket habe und versuche, mit der Datenbank im Pakethandler zu kommunizieren.
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");
}
}
Die Handle-Methode wird von einer asynchronen Task aufgerufen
if (_packetRepository.TryGetPacketByName(packetName, out var packet))
{
await packet.Handle(this, new ClientPacketReader(packetName, packetData));
}
else
{
Console.WriteLine("Unknown packet: " + packetName);
}
Hier ist die Methode, von der ich denke, dass sie das Problem verursacht
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);
}
GetConnection-Methode von DatabaseProvider:
public DatabaseConnection GetConnection()
{
var connection = new MySqlConnection(_connectionString);
var command = connection.CreateCommand();
return new DatabaseConnection(_logFactory.GetLogger(), connection, command);
}
Konstruktor von DatabaseConnection:
public DatabaseConnection(ILogger logger, MySqlConnection connection, MySqlCommand command)
{
_logger = logger;
_connection = connection;
_command = command;
_connection.Open();
}
Wenn ich diese Zeile auskommentiere, erreicht sie die Console.WriteLine
_connection.Open();
await. Das ist viel schwieriger zu diagnostizieren.
Connection.openkehrt nicht zurück, während versucht wird, eine Verbindung herzustellen, sondern gibt nach einer festgelegten Zeitüberschreitung endgültig auf. Sie können auch den Zeitlimitwert für das Verbindungsobjekt auf eine kleinere Zahl größer als 0 ändern und prüfen, ob eine Ausnahme vorliegt.