J'ai une fonction de blocage qui exécute une requête MySQL asynchrone et renvoie le résultat quand il est obtenu. La raison en est asynchrone est ce programme n'est pas autorisé à se bloquer lors d'une requête.Attente asynchrone lorsque la fonction C# est en cours d'exécution
La fonction est appelée lorsque l'utilisateur appuie sur un bouton, de sorte que la fonction peut être appelée plusieurs fois avant la fin de la première requête. J'ai pensé que je pourrais ajouter un booléen pour vérifier si une requête est en train d'être exécutée et que la fonction attende que cela soit fait avant de continuer, mais cela ne fonctionne pas comme prévu. Il y a un problème avec les deux DoEvents() que j'utilise. Si vous commentez l'une des deux, cela fonctionne très bien, sauf que l'interface utilisateur se fige.
Comment faire en sorte que la fonction effectue une attente non bloquante pendant l'exécution d'une requête, ainsi qu'une attente non bloquante pendant la récupération de la requête elle-même? Je préférerais vraiment garder ceci sur un thread, car la fonction elle-même bloque le code qui l'a appelée. Toute aide serait grandement appréciée!
public Exception LastError;
public MySqlConnection Conn;
public MySqlDataReader Reader;
public bool IsExecuting = false;
public MySqlDataReader MySQL_Query(string Query, [Optional] params string[] Values)
{
while (IsExecuting)
{
System.Windows.Forms.Application.DoEvents();
System.Threading.Thread.Sleep(20);
}
if (IsConnected() == false)
ConnectToDatabase();
for (int i = 0; i < Values.Length; i++)
Values[i] = MySQL_SafeValue(Values[i]);
if (Reader != null && Reader.IsClosed == false)
Reader.Close();
IsExecuting = true;
try
{
MySqlCommand Cmd = new MySqlCommand(String.Format(Query, Values), Conn);
IAsyncResult aRes = Cmd.BeginExecuteReader();
while (!aRes.IsCompleted)
{
System.Windows.Forms.Application.DoEvents();
System.Threading.Thread.Sleep(20);
}
Reader = Cmd.EndExecuteReader(aRes);
IsExecuting = false;
}
catch (Exception e)
{
IsExecuting = false;
LastError = e;
return null;
}
return Reader;
}