Silverlight同步通信

 

SL调用WCF方法,默认是异步的,但有些情况,我们使用同步会来的方便些,下面的文章提供了一种方式。

http://www.codeproject.com/KB/silverlight/SynchronousSilverlight.aspx

 

上述提供的方式是基于服务端WCF服务接口实现,可是有时不需要WCF服务接口,下面对此进行补充:

 

WCF服务如下:

namespace DanielVaughan.Silverlight.Examples.Web
{
    [ServiceContract(Namespace = "")]
	[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
	public class SimpleService //: ISimpleService
	{
		//static int connectionCount;

        [OperationContract]
		public string GetGreeting(string name)
		{
			Thread.Sleep(2000);
			return "Hi " + name;
		}

        [OperationContract]
        public List<string> GetDataList()
        {
            List<string> dataList = new List<string>();
            Random r = new Random(DateTime.Now.Millisecond);
            int max = r.Next(100);
            for (int i = 0; i <max ; i++)
            {
                Thread.Sleep(100);
                dataList.Add(i.ToString());
            }
            return dataList;
        }

        //public string InitiateConnection(string arbitraryIdentifier)
        //{
        //    return (++connectionCount).ToString();
        //}
	}
}

 

客户端:

        private void btnGetDataSynch_Click(object sender, RoutedEventArgs e)
        {
            this.lbData.ItemsSource = null;
            ThreadPool.QueueUserWorkItem(delegate
            {
                DisplayMessage("同步获取数据中...");

                var ws = ChannelManager.Instance.GetChannel<SimpleService>();
                try
                {
                    ObservableCollection<string> dataList = SynchronousChannelBroker.PerformAction<ObservableCollection<string>>(ws.BeginGetDataList, ws.EndGetDataList);
                    
                    //if (Dispatcher.CheckAccess())
                    //{
                    //    this.lbData.ItemsSource = dataList;
                    //}
                    //else
                    //{
                    //    Dispatcher.BeginInvoke(delegate
                    //    {
                    //        this.lbData.ItemsSource = dataList;
                    //    });
                    //}
                    DisplayData(this.lbData, dataList);                
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.StackTrace);
                }

                DisplayMessage("同步获取数据完成");
            });

        }

        void DisplayMessage(string message)
        {
            DisplayText(this.tbMsg, message);
        }

        void DisplayText(TextBlock textBlock, string message)
        {
            if (Dispatcher.CheckAccess())
            {
                textBlock.Text = message;
            }
            else
            {
                Dispatcher.BeginInvoke(delegate
                {
                    textBlock.Text = message;
                });
            }
        }

        void DisplayData(ListBox listBox, ObservableCollection<string> dataList)
        {
            if (Dispatcher.CheckAccess())
            {
                listBox.ItemsSource = dataList;
            }
            else
            {
                Dispatcher.BeginInvoke(delegate
                {
                    listBox.ItemsSource = dataList;
                });
            }
        }
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值