`
holoblog
  • 浏览: 1246014 次
博客专栏
E0fcf0b7-6756-3051-9a54-90b4324c9940
SQL Server 20...
浏览量:19287
文章分类
社区版块
存档分类
最新评论

Silverlight同步(Synchronous)调用WCF服务

 
阅读更多

  Silverlight的RIA应用中访问远端的WebService或WCF服务,都是通过异步线程模式调用的。在某些情况下我们的调用是需要同步进行,虽然Silverlight没有内置同步线程模式调用远端服务接口,但是我们可以通过多线程的处理来伪装出同步调用的实现。在.NET Framework的多线程编程中提供了丰富的线程接口,其中AutoResetEvent和ManualResetEvent在多线程编码中最为常用,本文将介绍如何通过AutoResetEvent的线程等待特性实现Silverlight同步调用远端WCF服务。

一、定义WCF服务

  为了演示同步调用WCF服务的实现,提供一个简单的WCF服务接口,完成返回一本图书基本信息,WCF服务接口定义如下:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->[ServiceContract]
publicinterfaceIDataService
{
[OperationContract]
BookGetBook();
}

publicclassBook
{
publicintID{get;set;}
publicstringName{get;set;}
publicstringAuthor{get;set;}
publicdoublePrice{get;set;}
}

  接口提供一个返回图书基本信息的方法,包括图书编好,图书名,图书作者以及图书价格。接口具体的实现如下代码:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->publicclassDataService:IDataService
{
publicBookGetBook()
{
returnnewBook
{
ID
=1001,
Name
="《三国演义》",
Author
="罗贯中",
Price
=89.50
};
}
}

  如上提供可正常运行的WCF服务接口,在需要调用接口的地方通过WEB引用既可生成该服务的客户端代理对象。

二、基于MVVM模式的视图模型

  MVVM模式的核心为INotifyPropertyChanged接口,对于实体模型对象和UI控件元素间提供了完善的同步更新特性。为了方便界面元素同步更新,这里引入了MVVP模式的简单应用。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->publicclassViewModelBase:INotifyPropertyChanged
{
publiceventPropertyChangedEventHandlerPropertyChanged;

protectedvoidRaisePropertyChangedEvent(stringpropertyName)
{
varhandler
=PropertyChanged;
if(handler!=null)
handler(
this,newPropertyChangedEventArgs(propertyName));
}
}

  还需要对应于服务接口中的Book对象定义一个ViewModel对象,详细如下代码所示:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->publicclassBookViewModel:ViewModelBase
{
privateintiD;
///<summary>
///图书ID
///</summary>
publicintID
{
get{returniD;}
set
{
iD
=value;
RaisePropertyChangedEvent(
"ID");
}
}

privatestringname;
///<summary>
///图书名称
///</summary>
publicstringName
{
get{returnname;}
set
{
name
=value;
RaisePropertyChangedEvent(
"Name");
}
}

privatestringauthor;
///<summary>
///图书作者
///</summary>
publicstringAuthor
{
get{returnauthor;}
set
{
author
=value;
RaisePropertyChangedEvent(
"Author");
}
}

privatedoubleprice;
///<summary>
///图书价格
///</summary>
publicdoublePrice
{
get{returnprice;}
set
{
price
=value;
RaisePropertyChangedEvent(
"Price");
}
}
}

三、基于AutoResetEvent的同步实现

  利用AutoResetEvent的线程等待特性,可以折中实现Silverlight同步调用远端WCF服务。其原理就是在Silverlight发起异步调用远端WCF的时候进行线程阻塞,比记录异步调用远端WCF服务接口的完成事件,当异步调用完成后就终止线程阻塞,从而获取状态事件对象中或得调用远程接口所返回的结果。由于视图模型对象实现了INotifyPropertyChanged接口能够及时的更新界面元素,以此间接的就实现了同步方式调用。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->publicclassAsyncCallStatus<T>
{
publicAsyncCallStatus()
{

}

publicTCompletedEventArgs{get;set;}
}

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->publicclassBookFacade
{
privateAutoResetEventautoResetEvent=newAutoResetEvent(false);

publicvoidGetBook(BookViewModelviewModel)
{
if(viewModel==null)
{
thrownewArgumentNullException("viewModel","参数不能为空。");
}

DataService.DataServiceClientclient
=newDataService.DataServiceClient();
client.GetBookCompleted
+=client_GetBookCompleted;

varstatus
=newAsyncCallStatus<GetBookCompletedEventArgs>();
client.GetBookAsync(status);
//阻塞线程
autoResetEvent.WaitOne();

if(status.CompletedEventArgs.Error!=null)
{
throwstatus.CompletedEventArgs.Error;
}
varbook
=status.CompletedEventArgs.Result;
viewModel.ID
=book.ID;
viewModel.Name
=book.Name;
viewModel.Author
=book.Author;
viewModel.Price
=book.Price;
}

privatevoidclient_GetBookCompleted(objectsender,GetBookCompletedEventArgse)
{
varstatus
=e.UserStateasAsyncCallStatus<GetBookCompletedEventArgs>;

status.CompletedEventArgs
=e;
//终止线程阻塞
autoResetEvent.Set();
}
}

四、Silverlight前端调用

  Siverlight前端就简单布局一个表单作为数据呈现界面,其代码如下:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><Gridx:Name="LayoutRoot"Background="White">
<GridHorizontalAlignment="Left"Name="grid1"VerticalAlignment="Top"Width="300"Margin="20">
<Grid.RowDefinitions>
<RowDefinitionHeight="30"></RowDefinition>
<RowDefinitionHeight="30"></RowDefinition>
<RowDefinitionHeight="30"></RowDefinition>
<RowDefinitionHeight="30"></RowDefinition>
<RowDefinitionHeight="30"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinitionWidth="60"></ColumnDefinition>
<ColumnDefinitionWidth="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<sdk:LabelHorizontalAlignment="Left"Content="图书编号:"VerticalAlignment="Center"Grid.Column="0"Grid.Row="0"/>
<TextBoxText="{BindingID}"Grid.Column="1"Grid.Row="0"></TextBox>
<sdk:LabelHorizontalAlignment="Left"Content="图书名称:"VerticalAlignment="Center"Grid.Column="0"Grid.Row="1"/>
<TextBoxText="{BindingName}"Grid.Column="1"Grid.Row="1"></TextBox>
<sdk:LabelHorizontalAlignment="Left"Content="图书作者:"VerticalAlignment="Center"Grid.Column="0"Grid.Row="2"/>
<TextBoxText="{BindingAuthor}"Grid.Column="1"Grid.Row="2"></TextBox>
<sdk:LabelHorizontalAlignment="Left"Content="图书价格:"VerticalAlignment="Center"Grid.Column="0"Grid.Row="3"/>
<TextBoxText="{BindingPrice}"Grid.Column="1"Grid.Row="3"></TextBox>

<ButtonContent="查询"Grid.Column="1"Grid.Row="4"Width="60"Height="23"Click="Button_Click"></Button>
</Grid>
</Grid>

  通过按钮执行调用WCF服务接口查询图书信息,按钮事件直接使用上面所写的图书门面类(BookFacade)的调用服务方法即可。

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->privatevoidButton_Click(objectsender,RoutedEventArgse)
{
try
{
ThreadPool.QueueUserWorkItem(
delegate(objecto)
{
BookViewModelviewModel
=newBookViewModel();

newBookFacade().GetBook(viewModel);

Deployment.Current.Dispatcher.BeginInvoke(()
=>this.DataContext=viewModel);
});
}
catch(Exceptionex)
{
MessageBox.Show(ex.ToString());
}
}

  最终的运行如下图所示效果:

  

  

分享到:
评论

相关推荐

    Synchronous_Silverlight与WCF同步操作

    当我们讨论“Synchronous Silverlight与WCF同步操作”时,意味着我们正在探讨如何在Silverlight客户端上执行与WCF服务之间的同步通信。 同步操作意味着客户端在等待服务响应之前会阻塞执行,直到接收到服务的返回...

    source-synchronous 源同步原理

    源同步(Source-Synchronous)是一种数字接口设计方法,主要用于高速数据传输系统中,例如DDR(Double Data Rate)内存、串行ATA(SATA)和PCI Express等。在这些系统中,数据的发送方不仅发送数据,还同时发送时钟...

    synchronous_socket_chat: 基于同步套接字的聊天软件

    2. **同步(Synchronous)**:在同步套接字编程中,当调用发送或接收数据的函数时,程序会暂停,直到操作完成。这种方式简单易懂,但效率较低,因为程序可能会因为等待I/O操作而浪费时间。 **聊天软件设计** 1. **...

    synchronous 数据同步系统,可用于同步 Postgresql Hadoop Mysql 文件等数据

    1. **数据迁移**:在升级数据库版本或更换数据库服务提供商时,`synchronous` 可以帮助平滑过渡。 2. **备份与恢复**:定期同步数据至备份存储,确保数据安全。 3. **实时分析**:将实时业务数据同步至大数据平台,...

    Synchronous Javascript call using Scriptable XML webservice (SJAX)

    然而,有时我们可能需要同步调用Web服务,这就是SJAX(Synchronous Javascript and XML)的用武之地。 **SJAX的概念** SJAX是JavaScript对Web服务的一种同步调用方式。与AJAX不同,它不使用异步请求,而是等待...

    socket 同步服务器存储

    同步套接字(Synchronous Socket)是一种网络编程中的通信机制,主要用于客户端和服务器之间的数据交换。同步套接字的工作方式是阻塞式的,即服务器在等待客户端连接或接收数据时,会暂停当前的执行流程,直到有数据...

    同步套接字服务器

    3. **同步(Synchronous)**:同步通信意味着发送方必须等待接收方的响应才能继续执行。在同步套接字服务器中,这意味着服务器在接收并处理完一个客户端请求后,才会接受下一个客户端的连接。 4. **服务器端程序**...

    cjx.zip_synchronous motor_同步电机

    总结来说,"cjx.zip_synchronous motor_同步电机"是一个关于同步电机MATLAB仿真的项目,包含了cjx.mdl模型文件。这个模型可能涵盖了同步电机的电气和机械模型、控制系统以及负载模型,提供了分析和优化电机性能的...

    同步函数编程_synchronous functional programming

    同步函数编程(Synchronous Functional Programming)是一种编程范式,它结合了函数式编程的特性与同步执行的概念。在函数式编程中,程序被视为一系列计算,而不是状态改变的过程,而同步执行意味着这些计算按照顺序...

    BMP Bit-synchronous Mapping Procedure 比特同步映射规程

    BMP Bit-synchronous Mapping Procedure 比特同步映射规程 BMP(Bit-synchronous Mapping Procedure)是指比特同步映射规程,是一种信号映射技术,用于将客户信号映射到OTN(Optical Transport Network)网络中的...

    MySQL关于异步复制、同步复制半同步复制、无损复制的概念与区别

    半同步复制(Semi-Synchronous Replication)是介于异步复制和同步复制之间的一种复制方式。在MySQL 5.7.2版本之前,默认是半同步复制,并通过一个参数值after_commit来实现。在这种模式下,事务在提交到主服务器的...

    同步套接字服务器客户端程序

    同步套接字(Synchronous Socket)是网络编程中一种基础且重要的通信机制,它基于TCP/IP协议栈,用于实现两台计算机之间的数据传输。在这个场景中,我们讨论的是一个已经测试成功的服务器和客户端程序,这通常涉及到...

    TBJ.zip_synchronous motor_同步电动机

    总的来说,"TBJ.zip_synchronous motor_同步电动机"文件包中的内容揭示了一个利用S7-200 PLC进行同步电动机状态监控的实例,涵盖了同步电动机的原理、PLC控制技术以及具体的编程实践,为深入学习和应用提供了宝贵的...

    Control of Permanent Magnet Synchronous Motors

    这本书详细讨论了永磁同步电机(Permanent Magnet Synchronous Motors,简称PMSM)的控制原理和方法。作者是来自德黑兰大学电气与计算机工程学院的教授,他在电机驱动领域有着深厚的学术造诣和丰富的实践经验。 在...

    Inverters that mimic synchronous generators

    逆变器模仿同步发电机技术是一项关键的电力电子技术,通过模拟同步发电机(Synchronous Generator, SG)的行为,使得逆变器可以控制其输出的电压和电流,以实现与电力系统中其他设备的协调配合。这种技术的核心在于...

    使用协同路由的同步异步_Synchronous asynchrony using coroutines_C+

    代码本身看起来像是同步调用,而在内部它使用异步调度。 特征 线程池。可以使用不同用途的不同池。 异步互斥体(也称为单独互斥体),称为无阻塞无死锁同步。 传送和传送。提供在不同线程池或调度程序之间传输执行...

    React Native的同步存储_Synchronous_storage_for_React_Native.

    React Native的同步存储是开发移动应用时处理本地数据的关键组件。在React Native框架中,开发者可以使用各种同步存储解决方案来保存应用程序的状态或者用户数据,即使在离线状态下也能访问这些数据。本文将深入探讨...

    power_syncmachineMy.zip_synchronous machine_同步机matlab_同步电动机_电动发电

    《同步电动机与同步发电机在MATLAB中的模拟分析》 同步电机,作为一种广泛应用于电力系统、工业驱动和电力电子领域的关键设备,具有运行稳定、效率高、调速范围广等优点。MATLAB作为强大的数学计算及仿真软件,为...

    虚拟同步VF控制_虚拟同步机_虚拟同步机VSG_

    虚拟同步机(Virtual Synchronous Generator, VSG)技术是一种基于电力电子技术的新型电力系统稳定控制策略,它模仿传统同步发电机的行为,为可再生能源并网提供了更为稳定和可靠的解决方案。在现代电力系统中,尤其...

Global site tag (gtag.js) - Google Analytics