我有一个阻塞函数,它执行异步 MySQL 查询并在获得结果时返回结果。原因是异步的,因为该程序在查询期间不允许锁定。
当用户按下按钮时调用该函数,因此该函数可能会在第一个查询完成之前被调用多次。我想我可以添加一个布尔值来检查查询是否正在执行,并让函数等到它完成后再继续,但它没有按预期工作。我使用的两个 DoEvents() 存在一些问题。如果您注释掉其中任何一个,它运行得很好,除了 UI 冻结。
如何使函数在执行查询时进行非阻塞等待,以及在获取查询本身时进行非阻塞等待?我真的更愿意将其保留在一个线程上,因为函数本身会阻塞调用它的代码。任何帮助将不胜感激!
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;
}