2011-07-13 102 views
2

我创建了网页与dropdownlist和两个gridview和selectedindex更改事件我填写这两个gridview但在运行两个gridview需要很长时间才能填充。缓慢运行的网页

注意:这个gridview中的一个我通过代码创建了它的数据源。 这里我的代码片段:

protected void _ddlPLCs_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    DataTable dtStatus = new DataTable(); 

    dtStatus = DBLayer.getMachineNameIPStatusPlCByName(_ddlPLCs.SelectedValue); 
    dtStatus.Columns.Add("Status", typeof(String)); 
    foreach (DataRow row in dtStatus.Rows) 
    { 
     if (LogicLayer.checkmachineStatus(row["machineIP"].ToString())) 
      row["Status"] = "Online"; 
     else 
      row["Status"] = "offline"; 

    } 

    GVStatus.DataSource = dtStatus; 
    GVStatus.DataBind(); 
    if (_ddlPLCs.SelectedValue.Contains('-')) 
    { 
     _dsPLCs.SelectParameters.Clear(); 
     _dsPLCs.SelectParameters.Add("PLCID","0"); 
     _dsPLCs.DataBind(); 
    } 
    else 
    { 
     _dsPLCs.SelectParameters.Clear(); 
     _dsPLCs.SelectParameters.Add("PLCID", DBLayer.getPlCIDByName(_ddlPLCs.SelectedValue).ToString()); 
     _dsPLCs.DataBind(); 
    }    


} 

恳求帮助我

回答

4

综观代码,我认为这个问题是在该方法中:

LogicLayer.checkmachineStatus()

我有预感,这实际上使得网络请求到远程机器/设备来确定他们的状态。这会很慢,特别是如果您的计算机可能不在线并且您必须等待它们超时。

如果这是罪魁祸首,你想要做的是建立一个在你的服务器上运行的服务。该服务应该不断在后台进行这些检查,并用结果更新数据库表。您可能希望在表中包含最后一次检查的时间戳。它甚至可能值得插入而不是更新,这样你就可以了解状态的值是不同的。你的ASP.Net代码应该只显示数据库表。

+1

你是对的;这是实际的问题..我将创建一个服务,因为你dvice :)再次感谢 – Ragaei

+1

哇精神调试。这是你如何得到100k +代表? –

1

档案!获取RedGate ANTS的试用版,并针对您的代码运行它。

如果你选择level timings行,它会在代码中的每一行旁边放一个数字,它会告诉你每行占用多长时间的百分比或以毫秒为单位。确保使用挂钟时间,而不是来自您的数据源的cpu时间或等待时间将不会被正确计数。

我敢打赌你的数据源很慢。

0

你做了很多的工作在这里的......

一些杂感

网络可能会很慢 - @Joel对一个好点。

有一件事要检查将回发 - 确保你只是在选定的索引更改数据绑定。

你为什么不在你的函数中使用'handles'caluse?可能不是问题,只是好奇。

如果您将您的“状态”列标题更改为“在线”,然后使用复选框(checked = online,unchecked = off-line或类似的东西,您只需更新每行的bool值,而不是字符串值

对于如何重新绑定您的下拉列表,某些事情看起来很奇怪因为...您在gridview中使用选定的值作为参数,绑定的下拉列表,这可能会导致不同的选定值。哪个可能可能导致您的gridview数据绑定再次在一个电路中不能确定,因为我看不到你的所有代码

无论如何,FWIW。祝你好运。