2011-03-05 69 views
1

我在IIS7.5和WCF回调技术上使用ASP.NET 4.0。回叫没有问题。 wcf服务可以在web客户端中触发回调方法,但它似乎在另一个线程与UI线程。如何从其他线程更新ASP.NET中textBox的值?

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 
} 

请帮我想想如何从回调事件更新我的文本框。

谢谢。

回答

2

这是如何WCF回调工作。每个回调调用都由它自己的线程提供服务。我认为发生这种情况的原因是因为您没有SynchronizationContext这会将请求发回当前线程(希望您的页面的当前实例)。相反的例子是在WPF或WinForm应用程序中使用的回调。默认情况下,这些应用程序中的UI线程有SynchronizationContext,因此如果您在UI线程中打开服务代理,回调请求会路由回UI线程 - 它有时会导致另一个问题,因此您可以关闭ServiceBehaviorAttributeSynchronizationContext的使用。

但即使你解决了这个问题,你也会在ASP.NET中处理同样的问题。对ASP.NET的每个请求都会创建处理程序的新实例。因此,来自浏览器的每个请求都会创建新的页面实例。

我相信,如果客户端是ASP.NET,那么WCF回调没有意义,因为我仍然没有看到任何工作实现。

+0

我已经创建了静态变量来存储从回调返回的消息,并使用定时器轮询此变量中的值以在UI上进行更新。它可以工作,但这只是一个文本框。我没有一个想法,但如何处理多个UI对象。 – tong 2011-03-06 06:50:48

0

我遇到了这个问题,其中只有UI线程可以执行UI更新,在使用WCF回调的WPF应用程序中。我在ASP.NET中没有做太多工作,所以我不能100%确定答案是一样的,但问题看起来非常相似。

我解决问题的方式是使用Dispatcher和lambdas将更改发送到UI线程。放入代码的上下文中,它看起来像

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

这应该将您的文本框的内容更新为回调中提供的文本。试一试,看看你如何去。

+1

问题是在ASP.NET中没有真正的“UI线程”。此外,由于您在服务器上,因此可以有数十个此类线程并行运行。 – 2011-03-06 00:23:14

+1

在ASP.NET中没有这样的Dispatcher.CurrentDispatcher.BeginInvoke ...。正如Ladislav Mrnka所说,它似乎在其他线程上运行。 – tong 2011-03-06 06:48:33