2016-08-16 5 views
0

ASP.NETとC#でWebアプリケーションをプログラミングしています。WebアプリケーションUIを別のスレッド(ASP.NETとC#)のIPコールバックから更新する

ページが読み込まれるときにリッスン(IP接続)し、メッセージを受け取ったときにラベルをその値で更新する必要があります(UIをコールバックから更新する)。 は私のコードを簡素化、私はメインページのためにこれを持っている:

protected void Page_Load(object sender, EventArgs e) 
    { 
     Thread listeningThread = new Thread(new ThreadStart(StartListening)); 
     listeningThread.Start(); 
    } 

これは、ASPXファイルにラベルです:

<asp:Label ID="MyLabel" runat="server" EnableViewState="False"></asp:Label> 

その後、これは、コールバックのための私の関数である。

private void StartListening() 
    { 
     Action<string> callbackRead = (string message) => 
     { 
      myLabel.text = message; 
     }; 
    } 

メッセージが正しく到着します。コールバック内にブレークポイントを置くと、その中にどのように入るのかがわかります。それにもかかわらず、UIは更新されません。もちろん、私はmyLabel.text = "何でも"と書く。 Page_Load部分でうまくいきます。

グリッドとDataSource + DataBind()(私はthisのチュートリアルに従っています)を試しましたが、私は同じ問題を抱えています。コールバックからではなくPage_Loadでそれを行うとうまくいきます。

私はこの分野での新たなんだと私は私はおそらく欠けている知っている(ほとんどがなどのWinForms、のためのものである)

を私は別の質問ではこれについて多くのことを読んだが、答えの非は私の問題を解決何か。私を手伝ってくれますか?私が欲しいものを達成する正しい方法は何ですか?前もって感謝します! myLabel.text =メッセージあなたがいる間サーバー側のラベルテキストを更新を設定することにより

+0

これを実現する適切な方法は[SignalR](http://signalr.net/)です。 –

+0

私はSignalRをプロジェクトの他の部分に使っていますが、これについては考えていませんでした。 – serfe

+0

私はこれを使って試しています:var context = GlobalHost.Connectio nManager.GetHubContex t (); context.Clients.All.broadcastMessage( "nam e"、 "message");それは何もしません。たとえば、ボタンを押したときなど、コールバックから外に出す場合にのみ機能します。 – serfe

答えて

2

は、[また]クライアントのブラウザ(S)内のテキストを更新する必要があります。

ajax pulling(アップデートを確認するためにサーバーにX秒ごとにajaxリクエストします)またはwebsockets(サーバーはクライアントブラウザに直接更新をプッシュできます)。

+0

しかし、私はPage_Loadの中にtext = "message"を直接設定すると、あまりにも多くのajax pullingやwebsocketsの助けを借りずにUI用に動作します。 – serfe

+0

バックグラウンドワーカーが実際にHTMLをレンダリングする前にPage_Loadが発生するため、後でそれを更新できます。 – serhiyb

関連する問題