有多个Dispatcher.BeginInvoke可以吗?

时间:2012-04-04 20:08:12

标签: wcf silverlight binding wcf-binding

我只是Silverlight和WCF的首发。我看到Miguel A. Castro撰写了一篇非常好的文章“http://www.netfxharmonics.com/2008/11/Understanding-WCF-Services-in-Silverlight-2”,该文章教授手动添加WCF。

在该示例中,它使用Dispatcher.BeginInvoke将服务返回的文本写入silverlight UI中的文本块。

       AsyncCallback asyncCallBack = delegate(IAsyncResult result)
        {
            List<Person> person = ((IPersonService_list)result.AsyncState).EndGetPersonData(result);
            this.Dispatcher.BeginInvoke(delegate
            {
                spMain.Children.Add(new TextBlock
                {
                    Text = person[0].FirstName + person[0].LastName + person[0].City + person[0].State
                });

            });
        };

我需要使用相同的服务填充多个控件。看来我不允许在BeginInvoke方法中调用另一个函数。拥有多个BeginInvoke方法的最佳方法是什么?这会消耗大量资源吗?

谢谢,

1 个答案:

答案 0 :(得分:0)

一种可行的方法:从WCF服务调用的结果中完整地构建一个封闭的UIElement结构,然后使用一个调用Dispatcher.BeginInvoke并将结构添加到spMain UIElement。例如:

StackPanel sp = new StackPanel();
TextBlock tb1 = new TextBlock({
    Text=person[0].FirstName + person[0].LastName
});
sp.Children.Add(tb1);
TextBlock tb2 = new TextBlock({Text="AND SO ON Use this pattern to add UIElements to the stackpanel."});

sp.Children.add(tb2);

//now - add the StackPanel which holds other UIElements to spMain.

this.Dispatcher.BeginInvoke(delegate(){
    spMain.Children.Add( sp );
});