在ASP.NET 4.0中执行冗长的函数

时间:2014-02-10 22:54:02

标签: c# jquery asp.net ajax internet-explorer

我是一名长期从事过网络开发的程序员。我在IIS 7.0上使用ASP.NET 4.0和C#。到目前为止,我没有遇到任何问题,并且实现了诸如JQuery之类的库。

我正在慢慢地学习网络的方式,因为我习惯于页面回发和AJAX实现。我最近尝试在我的网站上添加我无法实现的功能,即使在Stack Overflow和Google的帮助下也是如此。

请允许我解决问题:

我正在尝试在Web表单上创建一个函数,它允许我单击一个按钮,然后让服务器查询DB以获取主机名列表并ping结果中的每个名称。每个循环处理ping,然后将结果写入DB。在此过程中,虽然并非完全需要,但我有兴趣从循环中检索进度,以便使用" Pinging SomeHostname ..."等信息更新页面。

我已经尝试过UpdatePanels,UpdateProgress和各种触发器。在我的所有经验中,页面要么锁定,要么在调试期间收到超时。

我的上一个(非工作)解决方案如下所示:

网络表单:

<asp:UpdatePanel ID="PingUpdatePanel" runat="server" UpdateMode="Conditional">
        <ContentTemplate>
            <asp:Button ID="btnPingAll" runat="server" Text="Ping All" OnClick="PingAll_Click"></asp:Button>
            <asp:Timer ID="pingUpdateTimer" OnTick="pingUpdateTimer_Tick" Interval="1000" runat="server" />
            <div id="pingStatus" class="pingStatusBox" runat="server">
                <asp:Label ID="hostName" runat="server" Text="Initializing ping..."></asp:Label>
            </div>
        </ContentTemplate>
        -- TRIGGERS HERE --
</asp:UpdatePanel>

背后的代码:

protected void PingAll_Click(object sender, EventArgs e)
    {
        Thread pingThread = new Thread(new ThreadStart(PingHosts));
        pingThread.IsBackground = true;
        pingThread.Start();
    }

    private void PingHosts()
    {
        //Get information DataTable

        if (dataTable != null)
        {
            foreach (DataRow row in dataTable.Rows)
            {
                // Set label
                hostName.Text = row[0].ToString();
                PingUpdatePanel.Update();

               // Ping stuff and update DB
            }
        }
    }

有人能指出我如何在网络编程/ ASP.NET中正确处理这个问题吗?稍后可以使用此信息来生成冗长的报告。

如果我能更清楚,请告诉我,我感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

我认为你遇到的问题是你在与ui线程不同的线程上执行代码。所以你要么需要跨线程通信(http://www.dreamincode.net/forums/topic/35616-cross-thread-communication-in-c%23/),要么根据我上面的评论更新数据表并使用计时器读取。

答案 1 :(得分:0)

为了实现这一点,我最终创建了ping函数作为WebMethod。从那里,我在页面加载上拉出IP(如Jon P所建议的),将它们存储在隐藏字段中,并在循环中使用JQuery AJAX来执行该功能。

$.ajax({
            type: "POST",
            url: "PingIP.aspx/Ping",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            data: JSON.stringify({ "ipAddress": ipAddress }),
            processData: false,
            success: function (msg) {
            }
        });