Sadece zaman uyumsuzluk ve Görev ile başlıyorum ve kodum durdu. Gelen bir ağ paketim olduğunda ve paket işleyicisinin içindeki veritabanıyla iletişim kurmaya çalıştığımda olur.
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");
}
}
Tanıtıcı yöntemi, zaman uyumsuz bir görevden çağrılır
if (_packetRepository.TryGetPacketByName(packetName, out var packet))
{
await packet.Handle(this, new ClientPacketReader(packetName, packetData));
}
else
{
Console.WriteLine("Unknown packet: " + packetName);
}
İşte soruna neden olduğunu düşündüğüm yöntem
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'ın GetConnection yöntemi:
public DatabaseConnection GetConnection()
{
var connection = new MySqlConnection(_connectionString);
var command = connection.CreateCommand();
return new DatabaseConnection(_logFactory.GetLogger(), connection, command);
}
DatabaseConnection yapıcısı:
public DatabaseConnection(ILogger logger, MySqlConnection connection, MySqlCommand command)
{
_logger = logger;
_connection = connection;
_command = command;
_connection.Open();
}
Bu satıra yorum yaptığımda, Console.WriteLine
_connection.Open();
awaitüzerinde çalışan kodu asla etkinleştirmeyen bir Göreviniz vardır . Teşhis etmek çok daha zor.
Connection.openbağlanmaya çalışırken dönmez, ancak sonunda bir zaman aşımı ayarından sonra vazgeçer. Veya bağlantı nesnesindeki zaman aşımı değerini 0'dan küçük bir sayıya dönüştürebilir ve istisna olup olmadığını görebilirsiniz.