0

ウェブサイトのヒット数や人々の出身地などに関する情報を含むダッシュボードを作成しようとしています.

次のページを書きました。

<%@ 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;
    }
}
}

これを実行すると、何か問題が発生します。デバッガーは正常なエラーなしで動作を停止します。データベースからウィジェットをロードしますが、データベースから値を取得しません。

Mac で Monodevelop を使用しています。

4

1 に答える 1

0

ウィジェットの初期化メソッドを別のスレッド (InitWidgetsメソッド) で実行しています。このメソッドの実行時に、ページのレンダリングが既に終了している可能性があります。ASP.NET で非同期操作を使用する場合はAsynchronous Pages、MSDN について読むことをお勧めします。Async="true"Page ディレクティブ ( ) を設定して Web フォームを非同期としてマークし、Web フォームでメソッドを<%@ Page Async="true" ... %>使用するという考え方です。RegisterAsyncTask

于 2013-03-10T17:09:16.770 に答える