异步调用阻止mysql连接

问题描述

我有一个网格,其中每一行都有一个按钮,单击按钮启动异步过程,并在mysql数据库中插入一些记录

当我在未完成第一个调用的情况下单击网格上的另一个按钮时,即使再次启动它,整个事情也停止工作并且页面抛出错误

错误消息

MySql.Data.MySqlClient.MySqlException:'超时已过期。操作完成之前已过超时时间,或者服务器没有响应。'

它陷入了无休止的循环,整个应用程序的服务器都被阻止了,甚至本地服务器也无法正常工作

按钮点击按钮

protected void btnRun_Click(object sender,EventArgs e)
{
    RadButton btn = sender as RadButton;
        
    Task.Factory.StartNew(async () =>
    {
        await RunAsync(btn,num,int.Parse(Session["UserID"].ToString()));
        btn.Enabled = true;
        btn.ToolTip = "Job Complete";
    });
}    

public async Task RunAsync(RadButton btnRn,int batch,int userId)
{

    RadButton btn = btnRn as RadButton;
    string hwid = btn.CommandArgument;
    if (hwid != null && hwid != string.Empty)
    {
        //all 
        IEnumerable<CaseDetails> lstFilterHwList = lstCaseFiltered.Where(f => f.HWID == int.Parse(hwid)).ToList();
        lstJobs = lstJobs.Where(f => f.HWID == int.Parse(hwid) && f.StatusName.ToUpper() != "DONE").ToList();
        lstFilterHwList = lstFilterHwList.Where(f => !lstJobs.Any(lk => lk.JobContent == f.CaseID)).ToList();
        
        if (lstFilterHwList.Count() > 0)
        {

            foreach (CaseDetails caseDetail in lstFilterHwList)
            {

               
             
                if (printer != null)
                {
                    
                    //Station station = deviceRepository.GetStation(stationLocation);
                    if (station != null)
                    {
                        using (var httpClient = new HttpClient())
                        {
                            JobContent content = new JobContent();
                            content.JobName = "TDMSID_" + tdmsCase.TestCaseId;
                            content.JobFrom = "TED";
                            // Logger.WriteMessageToLog_AutoExcute("HwID" + printer.HWID);
                            content.HwId = printer.HWID;
                            content.Firmware = caseDetail.Firmware;
                            content.PrinterIP = printer.ADDRESS;
                           
                            content.MachineIP = station.StationIP;
                            content.MachineTypeID = "1";
                            content.userId =  tdmsUser.ZCATUID; //userId;//tdmsUser.ZCATUID;
                            content.ProjectId = 0;
                            content.ToolName = "ZCAT Plus";
                            content.AutomationId = caseDetail.CaseID.ToString();
                            content.DatabaseServer = "Test";
                            content.BatchID = batch;
                            string apiUrl = string.Empty;
                            
                            apiUrl = "http://xx.xx.xx.xx:8090/api/Jobs";
                            var response = await httpClient.PostAsync(apiUrl,CreateHttpContent<JobContent>(content));
                            //response.StatusCode
                            // response.EnsureSuccessStatusCode();
                            var data = await response.Content.ReadAsStringAsync();
                          

                        }

                    }
                   

                    
                }
               
            }
        }        
    }
}

解决方法

主要问题和问题是这样的:

await RunAsync(btn,num,int.Parse(Session["UserID"].ToString()));

因此,您阻止了代码并告诉它等待完成?为什么要费心去做所有工作来建立异步调用,然后通过告诉它无论如何都要放弃那个想法的好处?调用somthing异步是很棒的,但是在等待时调用callit并告诉它等待会在这里达到零,实际上,告诉它等待,您根本不会异步。

请记住,在按钮上单击整个网页都将转到服务器。然后,您后面的代码开始运行。在该代码退出sub之前,所有内容都将被阻塞,直到该代码完成并“返回”为止。完成代码后(退出子程序),然后将网页发送回浏览器。

因此您不能在后面捆绑代码,因为那会捆绑服务器上的网页。按钮代码必须快速出现。因此,您单击单击,调用例程async(不等待),然后该网页现在可以使旅行返回浏览器。

那么,在您竭尽全力设置了异步调用之后?然后,您可以使用“ await”将整个过程拆散。这意味着您的代码现在回到等待代码完成的状态。实际上,您不再异步了。该网页将卡在该例程中(并卡在服务器端)。

您必须删除await命令,并且必须让该代码运行通过。

因此,您必须删除等待状态。您不能阻止或让代码处于等待状态,因为如果这样做,则表明网页位于服务器端,没有单击按钮或客户端可以使用的任何功能。

它是这样的:

Your button click.
    --> web page travels up to server)
    --> code behind starts running
    --> code behind WHEN DONE - exit subs
    --> web page travels back down to client side
    --> user (client side)  now gets a whole new fresh page with controls updated.

 Your code behind cannot WAIT or the web page is blocked
 Code behind can call routines async and that is ok,but without waits

因此,您后面的代码无法等待。您必须删除await命令,该代码必须运行并返回。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...