非同期の MySQL クエリを実行し、取得時に結果を返すブロッキング関数があります。理由は非同期であり、このプログラムはクエリ中にロックすることが許可されていません。
ユーザーがボタンを押すと関数が呼び出されるため、最初のクエリが完了するまでに関数が数回呼び出される場合があります。ブール値を追加して、クエリが実行されているかどうかを確認し、関数が完了するまで待機してから続行できると考えましたが、意図したとおりに機能していません。私が使用する 2 つの DoEvents() には問題があります。いずれかをコメントアウトすると、UI がフリーズすることを除いて、問題なく動作します。
クエリの実行中に関数をノンブロッキング待機させ、クエリ自体のフェッチ中にノンブロッキング待機をさせるにはどうすればよいですか? 関数自体がそれを呼び出したコードをブロックしているため、これを1つのスレッドに保持することを本当に好みます。どんな助けでも大歓迎です!
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;
}