さまざまなサーバーからデータを取得して、システムの現在の状態を表示するページに取り組んでいます。
私のページには、5 つの異なるラベルとボタンがあります。ボタンをクリックすると、5 つの異なるスレッドがサーバーからデータを取得し、対応するラベル値を更新します。次のコードでテストアプリケーションを作成しました
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; }
}
ラベルの値は更新されますが、ページはサーバーからすべての値が取得されるまでロードされ続け、ページに一度に表示されます。
スレッドがデータを取得した場合、対応するラベルを更新して、他のプロセスがデータを取得したかどうかに関係なく顧客が利用できるようにする必要があり、データが取得されるとすぐに更新される必要があります。