我有一個阻塞函數,它執行異步MySQL查詢並在獲得結果時返回結果。原因是異步的是這個程序在查詢過程中不允許鎖定。執行C#函數時異步等待
該函數在用戶按下按鈕時調用,因此可能會在第一次查詢完成之前多次調用該函數。我想我可以添加一個布爾值來檢查查詢是否正在執行,並讓函數在繼續之前等待,直到它完成,但它沒有按預期工作。我使用的兩個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;
}