0

WCF サービスからデータを取得するスレッドを含む asp.net Web サイトがあります。そのスレッドは、各実行を 1 秒間待機する無限ループで実行されます。ここで、WCF サービスから取得したものをラベルで示したいと思います。そのラベルを UpdatePanel に追加し、.Update() メソッドを呼び出しました。例外はありませんが、ラベルはまったく更新されません。これが私のコードです(簡略化):

t = new Thread(new ThreadStart(() =>
{
   while (true)
   {
      Label1.Text = GetFromWCF() + " " + DateTime.Now.ToString();
      updatePanel.Update();
      Thread.Sleep(1000);
   }
}
));

t.IsBackground = true;
t.Start();

このコードは、ページの OnInit メソッドにあります。updatePanel は次のようになります。

<asp:ScriptManager runat="server" ID="scriptManager" EnablePartialRendering="true"/>
<asp:UpdatePanel runat="server" ID="updatePanel" UpdateMode="Conditional">
   <ContentTemplate>
      <asp:Label ID="Label1" runat="server" />
   </ContentTemplate>
</asp:UpdatePanel>

何か不足していますか?また、私が asp.net を初めて使用することをお知らせする必要があるかもしれません。

4

3 に答える 3

4

パーティーには少し遅れましたが、UpdatePanel 内に Timer オブジェクトを実装し、タイマーの "OnTick" イベントを使用してラベルを更新することで、これを回避できます。その後、必要な値をグローバル変数に出力するか、静的実装を使用して、Thread 関数を作り直すことができます。

<asp:UpdatePanel ID="MyPanel" UpdateMode="Conditional" runat="server">
    <ContentTemplate>
    <asp:Timer ID="MyTimer" OnTick="timer_tick" Interval="1000" runat="server" />
    <asp:Label ID="UpdateTextBox" Text="start" runat="server" />
    </ContentTemplate>
</asp:UpdatePanel>

protected void timer_tick(object sender, EventArgs e)
{
    UpdateTextBox.Text = Convert.ToString(myThreadClass.counter);
    MyPanel.Update();
}
于 2013-03-04T14:47:09.320 に答える
3

AjaxとUpdatePanelがどのように機能するかを完全には理解していません。

実際、UpdatePanelは、クライアント側から、postリクエストを作成してサーバーデータに要求し、それらを取得するのを待ちます。データを取得した後、クライアントを更新します。ブラウザはデータを取得するように要求する必要があります。サーバーは、最初のブラウザがデータを要求しない限り、データをブラウザに送信できません。

このコマンドupdatePanel.Update();は、投稿後のコードビハインドで更新があることをUpdatePanelに通知する意味があり、思ったように機能せず、呼び出したからといってUpdatePanelにデータを送信しません。

投稿後にそのようなクローズループを作成しても、UpdatePanelは接続が完全に完了するのを待って閉じてデータを表示するため、そのようなスレッドのループはデータを送信するための接続を確立できません。

アイデアを機能させるために、etherはクライアント側でタイマーを作成し、毎回データを要求します。これは、彗星の手法です。IIS/ASP.NETでAJAXを逆にします。

于 2012-09-20T10:04:12.417 に答える
2

トリガーを使用してみてください。

<asp:UpdatePanel runat="server" ID="update" UpdateMode="Conditional">
     <ContentTemplate>
         <asp:Label runat="server" ID="uiTime" />
         <asp:Button runat="server" ID="uiInternalButton" Text="Click" />
     </ContentTemplate>
     <Triggers>
         <asp:AsyncPostBackTrigger ControlID="uiAsynch" EventName="click" />
         <asp:PostBackTrigger ControlID="uiInternalButton" />
     </Triggers>
</asp:UpdatePanel>
<asp:Button runat="server" ID="uiPostback" Text="Click" />
于 2012-09-20T10:04:18.427 に答える