我正在开发一个页面,该页面将通过从不同服务器获取数据来显示系统的当前状态。
在我的页面上,我有五个不同的标签和一个按钮。我希望一旦我点击按钮,五个不同的线程从服务器获取数据并更新相应的标签值。我用以下代码做了一个测试应用程序
protected void Page_Load(object sender, EventArgs e)
{
Thread t = new Thread(updateLbl);
t.Start();
}
protected void btnUpdateStatus_Click(object sender, EventArgs e)
{
Thread[] arrThread = new Thread[5];
for (int i = 0; i < arrThread.Length; i++)
{
arrThread[i] = new Thread(new ParameterizedThreadStart(Update));
arrThread[i].Name = "Thread" + (i + 1).ToString();
arrThread[i].Start(
new Parameters()
{
id = i + 1,
label = this.Master.FindControl("MainContent").FindControl ("Label" + (i + 1).ToString()) as Label
} as object);
}
}
public void Update(object o)
{
Parameters p = o as Parameters;
if (p != null && p.label != null)
{
p.label.Text = GetSystemState(p.id);
}
}
class Parameters
{
public int id { get; set; }
public Label label { get; set; }
}
它确实会更新标签的值,但页面会继续加载,直到检索到服务器中的所有值,然后立即在页面上显示这些值。
我想要一些东西,如果线程已经检索到它;s的数据,无论其他流程是否检索到他们的数据,它的相应标签都必须更新并可供客户使用,并且必须在检索到数据后立即更新。
根本问题是理解ASP.Net页面的生命周期
基本上,您在页面上使用多线程,但服务器会向用户发送响应,直到页面处理完毕。
要获得您想要的输出,请遵循以下方法:
https://stackoverflow.com/a/11525692/1268570
更多信息:
- https://stackoverflow.com/a/11500932/1268570