C# ASP.NET页面因MySql连接而崩溃

C# ASP.NET页面因MySql连接而崩溃,c#,asp.net,mysql,monodevelop,C#,Asp.net,Mysql,Monodevelop,我试图写一个仪表盘,上面有关于网站点击率和人们来自哪里等信息 我写了下面一页: <%@ Page Language="C#" Inherits="Daschboard.Board" MasterPageFile="~/site.master" %> <asp:Content id="main" runat="server" ContentPlaceHolderID="main"> <asp:UpdatePanel runat="server" id=

我试图写一个仪表盘,上面有关于网站点击率和人们来自哪里等信息

我写了下面一页:

<%@ Page Language="C#" Inherits="Daschboard.Board" MasterPageFile="~/site.master" %>        
<asp:Content id="main" runat="server" ContentPlaceHolderID="main">
<asp:UpdatePanel runat="server" id="updateableWidgets">
    <ContentTemplate>
        <asp:ContentPlaceHolder id="WidgetsTable">
        </asp:ContentPlaceHolder>
    </ContentTemplate>
</asp:UpdatePanel>
</asp:Content>

隐藏以下代码:

using Widgets;
using System;
using System.Text;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Configuration;
using MySql.Data.MySqlClient;

namespace Daschboard
{
public partial class Board : System.Web.UI.Page
{
    protected List<IWidget> widgets;
    private MySqlConnection db = new MySqlConnection (ConfigurationManager.AppSettings ["mySql"]);

    protected void Page_Load(object sender, EventArgs e)
    {
        widgets = new List<IWidget>();
        BuildWidgtTable();
        var WidgetThread = new System.Threading.Thread(new System.Threading.ThreadStart(this.InitWidgets));
        WidgetThread.Start();
    }

    private string BuildWidgtTable ()
    {
        StringBuilder sb = new StringBuilder ();
        db.Open ();
        var tableName = ConfigurationManager.AppSettings ["DatabaseSiteName"];
        var query = "SELECT * FROM " + tableName + ", Widget WHERE " + tableName + ".WidgetID = Widget.WidgetID";
        var command = new MySqlCommand (query, db);
        var result = command.ExecuteReader ();
        while (result.Read()) {
            widgets.Add(getWidget(result.GetString(4)));
        }
        db.Close ();

        sb.Append("<table>\n");

        sb.Append("</table>");

        result.Close();
        return sb.ToString();
    }

    private void InitWidgets ()
    {
        db.Open();
        foreach (var widget in widgets) {
            var siteId = ConfigurationManager.AppSettings["siteID"];
            var query = "SELECT * FROM Values, Widget WHERE       Widget.WidgetID = Values.WidgetID AND SiteID = " + siteId;
            var command = new MySqlCommand(query, db);
            var result = command.ExecuteReader();
            while(result.Read()){
                Console.WriteLine(result);
            }
            result.Close();
            widget.Init ("1");
        }
        db.Close();
    }

    private IWidget getWidget (string fileName)
    {
        IWidget widget = null;
        switch (fileName) {
        case "PageHits":
            widget = new PageHits();
            break;
        case "SiteHits":
            widget = new SiteHits();
            break;
        }
        return widget;
    }
}
}
使用小部件;
使用制度;
使用系统文本;
使用System.Collections.Generic;
使用System.Web;
使用System.Web.UI;
使用系统配置;
使用MySql.Data.MySqlClient;
名称空间数据板
{
公共部分课程板:System.Web.UI.Page
{
受保护的列表小部件;
私有MySqlConnection db=newmysqlconnection(ConfigurationManager.AppSettings[“mySql”]);
受保护的无效页面加载(对象发送方、事件参数e)
{
widgets=newlist();
BuildWidgtTable();
var widgethread=new System.Threading.Thread(new System.Threading.ThreadStart(this.InitWidgets));
WidgetThread.Start();
}
私有字符串BuildWidgtTable()
{
StringBuilder sb=新的StringBuilder();
db.Open();
var tableName=ConfigurationManager.AppSettings[“DatabaseSiteName”];
var query=“从“+tableName+”小部件中选择*,其中“+tableName+”.WidgetID=Widget.WidgetID”;
var命令=新的MySqlCommand(查询,db);
var result=command.ExecuteReader();
while(result.Read()){
Add(getWidget(result.GetString(4));
}
db.Close();
某人附加(“\n”);
某人加上(“”);
result.Close();
使某人返回字符串();
}
私有void InitWidgets()
{
db.Open();
foreach(widgets中的var小部件){
var siteId=ConfigurationManager.AppSettings[“siteId”];
var query=“从Widget.WidgetID=Values.WidgetID和SiteID=“+SiteID;
var命令=新的MySqlCommand(查询,db);
var result=command.ExecuteReader();
while(result.Read()){
控制台写入线(结果);
}
result.Close();
widget.Init(“1”);
}
db.Close();
}
私有IWidget getWidget(字符串文件名)
{
IWidget widget=null;
开关(文件名){
“页面点击”案例:
widget=newpagehits();
打破
“网站点击”案例:
widget=newsitehits();
打破
}
返回控件;
}
}
}
当我运行这个程序时,出现了一些问题;调试器停止工作,但没有出现错误。 它确实从数据库中加载小部件,但不从数据库中获取值


我正在Mac上使用Monodevelop。

您正在一个单独的线程中运行小部件初始化方法(
InitWidgets
方法)。执行此方法时,页面可能已完成呈现。如果您想在ASP.NET中使用异步操作,我建议您阅读有关MSDN的内容。其思想是通过在页面指令(
)中设置
Async=“true”
,然后在web表单上使用
RegisterAsyncTask
方法,将您的web表单标记为异步。我的想法是在页面呈现后初始化小部件,但是如果我读对了,它仍然会等待所有的线程完成,然后页面才会显示在网站上。我是否需要使用其他东西,以便在页面加载后可以在没有回发的情况下更新内容?不,这不正确。页面将完成对客户端的渲染,但线程将继续在服务器上运行。当线程在服务器上完成执行时,您不能再修改客户端上的任何内容,因为页面已经呈现。请阅读我在回答中提供给您的文章,以便更好地理解ASP.NET中异步页面的工作原理。但是,如果您希望页面呈现,然后在以后根据需要初始化小部件,则必须使用AJAX,而不是服务器上的任何线程。阅读本例中的UpdatePanel。作为舒尔;)只要这个线程在运行,我就可以编辑页面上的内容。是的,用户可以修改页面上的内容,但是使用这个线程没有意义,因为你不能再通过它在UI上操作了。好的,非常感谢你提供的信息,你知道在页面呈现后,我如何从代码隐藏更新屏幕上的信息吗?或者这只能通过javascript或类似的东西来实现?