C#函数执行时异步等待

Lyn*_*nxy 0 c# mysql asynchronous function blocking

我有一个阻塞函数,它执行异步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;
    }
Run Code Online (Sandbox Code Playgroud)

Ada*_*son 6

您不应该使用DoEventsSleep创建响应式UI.要在UI中执行异步操作,请参阅BackgroundWorker类.