我是一名长期从事过网络开发的程序员。我在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中正确处理这个问题吗?稍后可以使用此信息来生成冗长的报告。
如果我能更清楚,请告诉我,我感谢您的帮助!
答案 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) {
}
});