Как обновить значение в textBox в ASP.NET из других потоков? - PullRequest
1 голос
/ 05 марта 2011

Я использую ASP.NET 4.0 на IIS7.5 и технику обратного вызова WCF. У меня нет проблем с обратным вызовом. Служба wcf может запустить метод обратного вызова в веб-клиенте, но, похоже, он находится в другом потоке с потоком пользовательского интерфейса.

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 из события обратного вызова.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 06 марта 2011

Так работает обратный вызов WCF. Каждый обратный вызов обслуживается собственным потоком. Я думаю, что причина этого заключается в том, что у вас нет SynchronizationContext, который будет указывать поступающий запрос обратно в текущий поток (и, надеюсь, текущий экземпляр вашей страницы). Противоположный пример - обратные вызовы, используемые в приложениях WPF или WinForm. Поток пользовательского интерфейса в этих приложениях по умолчанию имеет SynchronizationContext, поэтому, если вы открываете прокси службы в потоке пользовательского интерфейса, запросы на обратный вызов направляются обратно в поток пользовательского интерфейса - это иногда вызывает другие проблемы, поэтому вы можете отключить использование SynchronizationContext в ServiceBehaviorAttribute ,

Но даже если вы решите эту проблему, вы столкнетесь с той же проблемой в ASP.NET. Каждый запрос к ASP.NET создает новый экземпляр обработчика. Таким образом, каждый запрос от вашего браузера будет создавать новый экземпляр страницы.

Я считаю, что если клиент - ASP.NET, то обратный вызов WCF не имеет смысла, потому что я до сих пор не видел работающей реализации.

0 голосов
/ 06 марта 2011

Я столкнулся с этой проблемой, когда только поток пользовательского интерфейса может выполнять обновления пользовательского интерфейса в приложении WPF с использованием обратных вызовов WCF. Я не очень много работаю в ASP.NET, поэтому я не уверен на 100%, что ответ такой же, но проблема выглядит очень похоже.

Я решил проблему, используя Dispatcher и lambdas для отправки изменений в поток пользовательского интерфейса. Поместите в контекст вашего кода, это будет выглядеть примерно так:

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

Это должно обновить содержимое вашего текстового поля до текста, предоставленного в обратном вызове. Попробуйте и посмотрите, как у вас дела.

...