আমি কেবল অ্যাসিঙ্ক এবং টাস্ক দিয়ে শুরু করছি এবং আমার কোডটি প্রক্রিয়া বন্ধ করে দিয়েছে। যখন আমার কাছে ইনকামিং নেটওয়ার্ক প্যাকেট থাকে এবং আমি প্যাকেট হ্যান্ডলারের ভিতরে থাকা ডাটাবেসের সাথে চেষ্টা করে যোগাযোগ করি It
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");
}
}
হ্যান্ডেল পদ্ধতিটি একটি অ্যাসিঙ্ক টাস্ক থেকে কল করা হয়
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);
}
ডাটাবেসপ্রভাইডারের গেট সংযোগ পদ্ধতি:
public DatabaseConnection GetConnection()
{
var connection = new MySqlConnection(_connectionString);
var command = connection.CreateCommand();
return new DatabaseConnection(_logFactory.GetLogger(), connection, command);
}
ডাটাবেস সংযোগের নির্মাণকারী:
public DatabaseConnection(ILogger logger, MySqlConnection connection, MySqlCommand command)
{
_logger = logger;
_connection = connection;
_command = command;
_connection.Open();
}
আমি যখন এই লাইনটি মন্তব্য করি তখন এটি পৌঁছে যায় Console.WriteLine
_connection.Open();
awaitকরে না। এটি নির্ণয় করা অনেক কঠিন।
Connection.openএটি সংযোগ দেওয়ার চেষ্টা করার সময় ফিরে আসে না, তবে শেষ পর্যন্ত সময়সীমা নির্ধারণের পরে ছেড়ে দেবে। অথবা আপনি সংযোগ অবজেক্টের টাইমআউট মানটি 0 টির চেয়ে কম সংখ্যকতে পরিবর্তন করতে পারেন এবং ব্যতিক্রম আছে কিনা তা দেখুন।