मैं अभी async और टास्क के साथ शुरू कर रहा हूं और मेरे कोड ने प्रसंस्करण बंद कर दिया है। यह तब होता है जब मेरे पास एक आने वाला नेटवर्क पैकेट होता है और मैं पैकेट हैंडलर के अंदर डेटाबेस के साथ कोशिश करता हूं और संचार करता हूं।
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");
}
}
हैंडल विधि को एक async कार्य से कहा जाता है
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);
}
DatabaseProvider के GetConnection विधि:
public DatabaseConnection GetConnection()
{
var connection = new MySqlConnection(_connectionString);
var command = connection.CreateCommand();
return new DatabaseConnection(_logFactory.GetLogger(), connection, command);
}
DatabaseConnection का निर्माता:
public DatabaseConnection(ILogger logger, MySqlConnection connection, MySqlCommand command)
{
_logger = logger;
_connection = connection;
_command = command;
_connection.Open();
}
जब मैं इस लाइन पर टिप्पणी करता हूं, तो यह पहुंच जाता है Console.WriteLine
_connection.Open();
awaitपर है। इसका निदान करना बहुत कठिन है।
Connection.openकनेक्ट करने का प्रयास करते समय वापस नहीं आता है, लेकिन अंत में टाइमआउट सेट के बाद छोड़ देगा। या आप कनेक्शन ऑब्जेक्ट पर टाइमआउट मान 0 से अधिक छोटी संख्या में बदल सकते हैं, और देखें कि क्या अपवाद है।