Tôi mới bắt đầu với async và Nhiệm vụ và mã của tôi đã ngừng xử lý. Nó xảy ra khi tôi có một gói mạng đến và tôi thử và giao tiếp với cơ sở dữ liệu bên trong trình xử lý gói.
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");
}
}
Phương thức Xử lý được gọi từ một tác vụ không đồng bộ
if (_packetRepository.TryGetPacketByName(packetName, out var packet))
{
await packet.Handle(this, new ClientPacketReader(packetName, packetData));
}
else
{
Console.WriteLine("Unknown packet: " + packetName);
}
Đây là phương pháp mà tôi nghĩ là gây ra vấn đề
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);
}
Phương thức GetConnection của DatabaseProvider:
public DatabaseConnection GetConnection()
{
var connection = new MySqlConnection(_connectionString);
var command = connection.CreateCommand();
return new DatabaseConnection(_logFactory.GetLogger(), connection, command);
}
Trình xây dựng của DatabaseConnection:
public DatabaseConnection(ILogger logger, MySqlConnection connection, MySqlCommand command)
{
_logger = logger;
_connection = connection;
_command = command;
_connection.Open();
}
Khi tôi nhận xét ra dòng này, nó đạt đến Console.WriteLine
_connection.Open();
await
sử dụng. Điều đó khó chẩn đoán hơn nhiều.
Connection.open
không quay lại trong khi nó đang cố gắng kết nối, nhưng cuối cùng sẽ bỏ cuộc sau khi hết thời gian. Hoặc bạn có thể thay đổi giá trị thời gian chờ trên đối tượng kết nối thành một số nhỏ hơn 0 và xem có ngoại lệ nào không.