[英]Using ServerController and Update Panel update not working
因此,我有一个中继器,它在远程服务器上显示自定义功能的列表。 中继器显示如下。
serverName serviceName serviceStatus Button1 Button2
----------------------------------------------------------
Carolina StatsTracker Running update stop
...
..
.
serviceStatus插入中继器内的更新面板中
<asp:UpdatePanel ID="statusUpdate" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="false">
<ContentTemplate>
<td><asp:Label ID="RowStatus" Width="100px" Text="Status..." runat="server" /></td>
</ContentTemplate>
</asp:UpdatePanel>
并在后面的代码中,我通过servercontroller向服务器发送命令,并尝试实时更新serviceStatus或至少实时更新。 像这样
if (svc.Status != ServiceControllerStatus.Stopped)
{
svc.Stop();
StatusLabel.Text = "Stopping";
statusUPdatePanel.Update();
while (svc.Status != ServiceControllerStatus.Stopped)
{
System.Threading.Thread.Sleep(1000);
svc.Refresh();
}
StatusLabel.Text = svc.Status.ToString();
statusUPdatePanel.Update();
}
System.Threading.Thread.Sleep(1000);
if (svc.Status != ServiceControllerStatus.Running)
{
svc.Start();
StatusLabel.Text = "Starting";
statusUPdatePanel.Update();
while (svc.Status != ServiceControllerStatus.Running)
{
System.Threading.Thread.Sleep(1000);
svc.Refresh();
}
StatusLabel.Text = svc.Status.ToString();
statusUPdatePanel.Update();
}
问题是状态不会实时更新。 它只会更新为正在运行或错误的最终值。 但绝不会显示正在发生的停止,开始或停止。 还要在按钮上单击,在serverController运行时禁用按钮,这是一个很小的用户验证步骤,似乎并没有导致按钮被禁用。 我已经阅读了很多有关updatepanel的文章,并认为这可能是一个具有约束力的问题,但是我不确定,因为我已经厌倦了许多建议的解决方案,但无济于事。
在此先感谢您的帮助。
根据您的问题,您想刷新 两次 updatePanel! 这是不可能的。 (部分)回发将仅在您的方法完成时发生...此外,那些while (...)
是个坏主意,imo。 你可以 使用 ,而
ServiceController.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 5));
但这并不能解决您希望同时看到两个状态(xxxPending和xxx)的问题。 我认为这样做只有一次机会-您必须向服务器重新询问给定服务的当前状态。 所以我创建了一个例子
对我来说效果很好-已通过我的本地服务进行了测试。
serviceController_Repeater.aspx
<head runat="server">
<title></title>
<script type="text/javascript" src="js/jquery-1.7.1.js"></script>
<script type="text/javascript">
$(document).ready(function () {
console.log("Add AJAX calls to buttons\n");
$('input[type=button]').click(
function () {
changeStatus($(this).attr("value"), $(this).parents("tr").find("span[id$=lblName]"), $(this).parents("tr").find("span[id$=lblStatus]"));
});
});
function changeStatus(newStatus, displayLabel, statusLabel) {
var displayName = displayLabel.text();
console.log("change status to '" + newStatus + "' for service '" + displayName + "'");
$.ajax({
type: "POST",
url: "serviceController_Repeater.aspx/ChangeStatus",
data: "{ 'newStatus': '" + newStatus + "', 'displayName' : '" + displayName + "'}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
console.log("server says\n\tnew status is now: " + msg.d);
statusLabel.text(msg.d);
if (newStatus != "")
window.setTimeout(function () { changeStatus("", displayLabel, statusLabel) }, 5000);
}
});
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Repeater ID="rptServices" runat="server">
<HeaderTemplate>
<table>
<thead>
<tr>
<th>
Name
</th>
<th>
Status
</th>
<th colspan="4">
</th>
</tr>
</thead>
<tbody>
</HeaderTemplate>
<FooterTemplate>
</tbody></table></FooterTemplate>
<ItemTemplate>
<tr id="1">
<td>
<asp:Label ID="lblName" runat="server" Text='<%# Eval("DisplayName") %>'></asp:Label>
</td>
<td>
<asp:Label ID="lblStatus" runat="server" Text='<%# Eval("Status") %>'></asp:Label>
</td>
<td>
<input type="button" <%# Eval("Status").ToString()=="Stopped" ? "" : "disabled" %> value="Start" />
</td>
<td>
<input type="button" <%# Eval("Status").ToString()=="Running" ? "" : "disabled" %> value="Stop" />
</td>
<td>
<input type="button" <%# Eval("Status").ToString()=="Running" ? "" : "disabled" %> value="Pause" />
</td>
<td>
<input type="button" <%# Eval("Status").ToString()=="Paused" ? "" : "disabled" %> value="Continue" />
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
</div>
</form>
</body>
serviceController_Repeater.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
bindServices();
}
private void bindServices()
{
ServiceController[] services = ServiceController.GetServices();
rptServices.DataSource = services;
rptServices.DataBind();
}
[WebMethod]
public static string ChangeStatus(string newStatus, string displayName)//
{
Debug.WriteLine(string.Format("Service {0} new status {1}", displayName, newStatus));
ServiceController sc = new ServiceController(displayName);
switch (newStatus)
{
case "Start":
sc.Start();
// instead of waiting on the SERVER for xxx secondes
// immediately RETURN to CLIENT
//sc.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 15));
break;
case "Stop":
sc.Stop();
break;
case "Pause":
sc.Pause();
break;
case "Continue":
sc.Continue();
break;
default:
break;
}
return sc.Status.ToString();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.