日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

Silverlight同步(Synchro“.NET研究”nous)调用WCF服务

發(fā)布時(shí)間:2025/4/5 asp.net 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Silverlight同步(Synchro“.NET研究”nous)调用WCF服务 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  Silverlight的RIA應(yīng)用中訪問遠(yuǎn)端的WebService或WCF服務(wù),都是通過異步線程模式調(diào)用的。在某些情況下我們的調(diào)用是需要同步進(jìn)行,雖然Silverlight沒有內(nèi)置同步線程模式調(diào)用遠(yuǎn)端服務(wù)接口,但是我們可以通過多線程的處理來偽裝出同步調(diào)用的實(shí)現(xiàn)。在.NET Framework的多線程編程中提供了豐富的線程接口,其中AutoResetEvent和ManualResetEvent在多線程編碼中最為常用,本文將介紹如何通過AutoResetEvent的線程等待特性實(shí)現(xiàn)Silverlight同步調(diào)用遠(yuǎn)端WCF服務(wù)。

  一、定義WCF服務(wù)

  為了演示同步調(diào)用WCF服務(wù)的實(shí)現(xiàn),提供一個(gè)簡單的WCF服務(wù)接口,完成返回一本圖書基本信息,WCF服務(wù)接口定義如下:

[ServiceContract]
public?interface?IDataService
{
????[OperationContract]
????Book?GetBook();
}

public?class?Book
{
????
public?int?ID?{?get;?set;?}
????
public?string?Name?{?get;?set;?}
????
public?string?Author?{?get;?set;?}
????
public?double?Price?{?get;?set;?}
}

  接口提供一個(gè)返回圖書基本信息的方法,包括圖書編好,圖書名,圖書作者以及圖書價(jià)格。接口具體的實(shí)現(xiàn)如下代碼:

public?class?DataService?:?IDataService
{
????
public?Book?GetBook()
????{
????????
return?new?Book
????????{
????????????ID?
=?1001,
????????????Name?
=?"《三國演義》",
????????????Author?
=?"羅貫中",
????????????Price?
=?89.50
????????};
????}
}

?  如上提供可正常運(yùn)行的WCF服務(wù)接口,在需要調(diào)用接口的地方通過WEB引用既可生成該服務(wù)的客戶端代理對象。

  二、基于MVVM模式的視圖模型

  MVVM模式的核心為INotifyPropertyChanged接口,對于實(shí)體模型對象和UI控件元素間提供了完善的同步更新特性。為了方便界面元素同步更新,這里引入了MVVP模式的簡單應(yīng)用。

public?class?ViewModelBase?:?INotifyPropertyChanged
{
????
public?event?PropertyChangedEventHandler?PropertyChanged;

????
protected?void?RaisePropertyChangedEvent(string?propertyName)
????{
????????var?handler?
=?PropertyChanged;
????????
if?(handler?!=?null)
????????????handler(
this,?new?PropertyChangedEventArgs(propertyName上海企業(yè)網(wǎng)站設(shè)計(jì)與制作));
????}
}

  還需要對應(yīng)于服務(wù)接口中的Book對象定義一個(gè)ViewModel對象,詳細(xì)如下代碼所示:

public?class?BookViewModel?:?ViewModelBase
{
????
privateint?iD;
????
///?<summary>
????
///?圖書ID
????
///?</summary>
????public?int?ID
????{
????????
get?{?return?iD;?}
????????
set
????????{
????????????iD?
=?value;
????????????RaisePropertyChangedEvent(
"ID");
????????}
????}

????
private?string?name;
????
///?<summary>
????
///?圖書名稱
????
///?</summary>
????public?string?Name
????{
????????
get?{?return?name;?}
????????
set
????????{
????????????name?
=?value;
????????????RaisePropertyChangedEvent(
"Name");
????????}
????}

????
private?string?author;
????
///?<summary>
????
///?圖書作者
????
///?</summary>
????上海閔行企業(yè)網(wǎng)站設(shè)計(jì)與制作tyle="color: #0000ff;">public?string?Author
????{
????????
get?{?return?author;?}
????????
set
????????{
????????????author?
=?value;
????????????RaisePropertyChangedEvent(
"Author");
????????}
????}

????
private?double?price;
????
///?<summary>
????
///?圖書價(jià)格
????
///?</summary>
????public?double?Price
????{
????????
get?{?return?price;?}
????????
set
????????{
????????????price?
=?value;
????????????RaisePropertyChangedEvent(
"Price");
????????}
????}
}

三、基于AutoResetEvent的同步實(shí)現(xiàn)

?  利用AutoResetEvent的線程等待特性,可以折中實(shí)現(xiàn)Silverlight同步調(diào)用遠(yuǎn)端WCF服務(wù)。其原理就是在Silverlight發(fā)起異步調(diào)用遠(yuǎn)端WCF的時(shí)候進(jìn)行線程阻塞,比記錄異步調(diào)用遠(yuǎn)端WCF服務(wù)接口的完成事件,當(dāng)異步調(diào)用完成后就終止線程阻塞,從而獲取狀態(tài)事件對象中或得調(diào)用遠(yuǎn)程接口所返回的結(jié)果。由于視圖模型對象實(shí)現(xiàn)了INotifyPropertyChanged接口能夠及時(shí)的更新界面元素,以此間接的就實(shí)現(xiàn)了同步方式調(diào)用。

public?class?AsyncCallStatus<T>
{
????
public?AsyncCallStatus()
????{

????}

????
public?T?CompletedEventArgs?{?get;?set;?}
}
public?class?BookFacade
{
????
private?AutoResetEvent?autoResetEvent?=?new?AutoResetEvent(false);

????
public?void?GetBook(BookViewModel?viewModel)
????{
????????
if?(viewModel?==?null)
????????{
????????????
throw?new?ArgumentNullException("viewModel",?"參數(shù)不能為空。");
????????}

????????DataService.DataServiceClient?client?
=?new?DataService.DataServiceClient();
????????client.GetBookCompleted?
+=?client_GetBookCompleted;

????????var?status?
=?new?AsyncCallStatus<GetBookCompletedEventArgs>();
????????client.GetBookAsync(status);
????????
//阻塞線程
????????autoResetEvent.WaitOne();

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

????
private?void?client_GetBookCompleted(object?sender,?GetBookCompletedEventArgs?e)
????{
????????var?status?
=?e.UserState?as?AsyncCallStatus<GetBookCompletedEventArgs>;

????????status.CompletedEventArgs?
=?e;
????????
//終止線程阻塞
????????autoResetEvent.Set();
????}
}

  四、Silverlight前端調(diào)用

  Siverlight前端就簡單布局一個(gè)表單作為數(shù)據(jù)呈現(xiàn)界面,其代碼如下:

<Grid?x:Name="LayoutRoot"?Background="White">
????
<Grid?HorizontalAlignment="Left"?Name="grid1"?VerticalAlignment="Top"?Width="300"?Margin="20">
????????
<Grid.RowDefinitions>
????????????
<RowDefinition?Height="30"上海網(wǎng)站建設(shè)pan>></RowDefinition>
????????????
<RowDefinition?Height="30"></RowDefinition>
????????????
<RowDefinition?Height="30"></RowDefinition>
????????????
<RowDefinition?Height="30"></RowDefinition>
????????????
<R上海企業(yè)網(wǎng)站制作owDefinition?Height="30"></RowDefinition>
????????
</Grid.RowDefinitions>
????????
<Grid.ColumnDefinitions>
????????????
<ColumnDefinition?Width="60"></ColumnDefinition>
????????????
<ColumnDefinition?Width="*"></ColumnDefinition>
????????
</Grid.ColumnDefinitions>
????????
<sdk:Label??HorizontalAlignment="Left"?Content="圖書編號:"?VerticalAlignment="Center"?Grid.Column="0"?Grid.Row="0"/>
????????
<TextBox?Text="{Binding?ID}"?Grid.Column="1"?Grid.Row="0"></TextBox>
????????
<sdk:Label??HorizontalAlignment="Left"?Content="圖書名稱:"?VerticalAlignment="Center"?Grid.Column="0"?Grid.Row="1"/>
????????
<TextBox?Text="{Binding?Name}"?Grid.Column="1"?Grid.Row="1"></TextBox>
????????
<sdk:Label??HorizontalAlignment="Left"?Content="圖書作者:"?VerticalAlignment="Center"?Grid.Column="0"?Grid.Row="2"/>
????????
<TextBox?Text="{Binding?Author}"?Grid.Column="1"?Grid.Row="2"></TextBox>
????????
<sdk:Label??HorizontalAlignment="Left"?Content="圖書價(jià)格:"?VerticalAlignment="Center"?Grid.Column="0"?Grid.Row="3"/>
????????
<TextBox?Text="上海徐匯企業(yè)網(wǎng)站制作le="color: #808000;">{Binding?Price}"?Grid.Column="1"?Grid.Row="3"></TextBox>?
????????????
????????
<Button?Content="查詢"?Grid.Column="1"?Grid.Row="4"?Width="60"?Height="23"?Click="Button_Click"></Button>
????
</Grid>
</Grid>

?  通過按鈕執(zhí)行調(diào)用WCF服務(wù)接口查詢圖書信息,按鈕事件直接使用上面所寫的圖書門面類(BookFacade)的調(diào)用服務(wù)方法即可。

private?void?Button_Click(object?sender,?RoutedEventArgs?e)
{
????
try
????{
????????ThreadPool.QueueUserWorkItem(
delegate(object?o)
????????{
????????????BookViewModel?viewModel?
=?new?BookViewModel();

????????????
new?BookFacade().GetBook(viewModel);

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

?  最終的運(yùn)行如下圖所示效果:

  

  

轉(zhuǎn)載于:https://www.cnblogs.com/waw/archive/2011/10/18/2216979.html

總結(jié)

以上是生活随笔為你收集整理的Silverlight同步(Synchro“.NET研究”nous)调用WCF服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。