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或类似的东西来实现?