1

IIS7.5でASP.NET4.0を使用しており、WCFコールバック手法を使用しています。コールバックは問題ありません。wcfサービスはWebクライアントでコールバックメソッドを起動できますが、UIスレッドとは別のスレッドにあるようです。

public partial class _Default : System.Web.UI.Page, IServiceCallback
{
    private IService proxy = null;
    private static TextBox _textBoxtest;

    protected void Page_Load(object sender, EventArgs e)
    {
        _textBoxtest = TextBox1;
    }      

    protected void Button1_Click(object sender, EventArgs e)
    {
        //then server will call back to FireCallBackFromServer
        proxy.CallService(type, "someObject");
    }

    #region IServiceCallback Members

    public void FireCallBackFromServer(string txt)
    {
        TextBox1.Text = txt; <-- the value does not update on textBox
    }

    #endregion
}

コールバックイベントからtextBoxを更新する方法を考えるのを手伝ってください。

ありがとうございました。

4

2 に答える 2

2

これは、WCF コールバックがどのように機能するかです。各コールバック呼び出しは、独自のスレッドによって処理されます。これが発生する理由は、SynchronizationContext着信要求を現在のスレッド (そしてできればページの現在のインスタンス) に戻すものがないためだと思います。反対の例は、WPF または WinForm アプリケーションで使用されるコールバックです。これらのアプリケーションの UI スレッドはデフォルトで、UI スレッドでサービス プロキシを開くと、コールバックへのリクエストが UI スレッドにルーティングされます。別の問題が発生する場合があるため、 inSynchronizationContextの使用をオフにすることができます。SynchronizationContextServiceBehaviorAttribute

しかし、この問題を解決したとしても、ASP.NET でも同じ問題に対処することになります。ASP.NET への各要求は、ハンドラーの新しいインスタンスを作成します。そのため、ブラウザからのリクエストごとにページの新しいインスタンスが作成されます。

クライアントが ASP.NET の場合、WCF コールバックは意味をなさないと思います。なぜなら、まだ実装が機能していないからです。

于 2011-03-05T21:08:41.987 に答える
0

WCF コールバックを使用する WPF アプリケーションで、UI スレッドのみが UI 更新を実行できるというこの問題に遭遇しました。私は ASP.NET で多くの作業を行っていないため、答えが同じであると 100% 確信しているわけではありませんが、問題は非常によく似ています。

問題を解決する方法は、Dispatcher とラムダを使用して変更を UI スレッドに送信することでした。コードのコンテキストに入れると、次のようになります

public void FireCallBackFromServer(string txt)
{
    Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => TextBox1.Text = txt;));
}

これにより、テキストボックスのコンテンツがコールバックで提供されたテキストに更新されます。試してみて、様子を見てください。

于 2011-03-05T21:22:09.227 に答える