带有 Dispatcher 和异步 WCF 服务的 Silverlight 应用程序






4.85/5 (6投票s)
带有 Dispatcher 和异步 WCF 服务的 Silverlight 应用程序
- 下载 DispatherWithBusyIndicator-noexe.zip - 1.6 MB
- 下载 DispatherWithBusyIndicator.zip - 4.8 MB
- 下载 Dispatcher-noexe.zip - 915.9 KB
- 下载 Dispatcher.zip - 3.1 MB
本文介绍了 Dispatcher,它可以使 Silverlight 应用程序保持响应。它演示了 Dispatcher 如何在从异步调用的 WCF 服务响应后更新应用程序的 UI,同时继续执行其他任务。
在开始阅读本文之前,您可以从 MSDN 阅读有关 Dispatcher 的更多信息。
阅读更多: DependencyObject.Dispatcher 属性
演示应用程序是关于什么的?
这是一个应用程序,它在 UI 上使用 Dispatcher 和 WCF 服务填充 List-box,WCF 服务是异步调用的,因此实际线程可以执行任务而不会被阻塞。
其次,在 UI 上单击按钮时,它会选择列表中通过 Dispatcher 和 WCF 服务获取的产品。
因此,该应用程序演示了如何在 Silverlight 应用程序中使用 Dispatcher,使其应用程序更具响应性,并在不阻塞其他线程的情况下更新 UI。
Silverlight 页面的 UI
在“项目列表”页面中,List-box 使用 Dispatcher 和调用 WCF 服务异步填充。
其次,在按钮单击时,项目会选择在 listbox 中,这些项目是通过进行异步 WCF 服务调用获取的,并且 UI 会由 Dispatcher 更新。
接下来,以下文章将详细介绍此 Silverlight 页面的代码执行过程,以及 Dispatcher 和异步 WCF 服务组合的工作原理。
应用程序结构
以上是应用程序的结构,它包含三个项目:
1) DataService - 项目包含 WCF 服务。
2) BusinessApplication1 - Silverlight 应用程序,即使用 Silverlight 开发的应用程序页面。
3) BusinessApplication1.Web - 它托管 Silverlight 应用程序。
DataService 项目
WCF 服务
WCF 文件是应用程序结构中“DataServicwe”项目的一部分。此应用程序的服务文件包含以下两个方法:
GetList - 调用此方法以返回所有产品的列表,一旦在 UI 上调用完成,您可以看到产品列表已填充。
GetSelectedList - 此方法获取所选产品的列表,当用户按下 UI 上的按钮时,这些产品将被突出显示。在开始阅读本文之前,您可以从 MSDN 阅读有关 Dispatcher 的更多信息。
阅读更多: DependencyObject.Dispatcher 属性
演示应用程序是关于什么的?
这是一个应用程序,它在 UI 上使用 Dispatcher 和 WCF 服务填充 List-box,WCF 服务是异步调用的,因此实际线程可以执行任务而不会被阻塞。
其次,在 UI 上单击按钮时,它会选择列表中通过 Dispatcher 和 WCF 服务获取的产品。
因此,该应用程序演示了如何在 Silverlight 应用程序中使用 Dispatcher,使其应用程序更具响应性,并在不阻塞其他线程的情况下更新 UI。
Silverlight 页面的 UI
在“项目列表”页面中,List-box 使用 Dispatcher 和调用 WCF 服务异步填充。
其次,在按钮单击时,项目会选择在 listbox 中,这些项目是通过进行异步 WCF 服务调用获取的,并且 UI 会由 Dispatcher 更新。
接下来,以下文章将详细介绍此 Silverlight 页面的代码执行过程,以及 Dispatcher 和异步 WCF 服务组合的工作原理。
应用程序结构
以上是应用程序的结构,它包含三个项目:
1) DataService - 项目包含 WCF 服务。
2) BusinessApplication1 - Silverlight 应用程序,即使用 Silverlight 开发的应用程序页面。
3) BusinessApplication1.Web - 它托管 Silverlight 应用程序。
DataService 项目
WCF 服务
WCF 文件是应用程序结构中“DataServicwe”项目的一部分。此应用程序的服务文件包含以下两个方法:
GetList - 调用此方法以返回所有产品的列表,一旦在 UI 上调用完成,您可以看到产品列表已填充。
public List<string> GetList() { List<string> lst = new List<string> {"Product1","Product2","Product3","Product4","Product5"}; return lst; }
public List<string> GetSelectedList() { List<string> lst = new List<string> {"Product1","Product3","Product5"}; return lst; } </string>注意:目前,在演示中,这些方法直接返回硬编码的字符串列表,但在实际场景中,它们将被数据库调用替换,即调用数据库获取产品列表,以及调用数据库获取属于用户的产品列表。
BusinessApplication1 (Silverlight 应用程序)
WCF 代理
代理是调用 WCF 服务并将响应返回到 UI 的类文件,即它是 Silverlight UI 和 WCF 服务之间的桥梁。
以下变量是 WCF 客户端服务类的对象,该类由 Visual Studio 从 Silverlight 应用程序中使用的 WCF 服务生成。
Service1Client svr;GetData 方法从 xaml.cs 页面调用,以填充应用程序 UI 上可用的产品列表。
public void GetData(Action<ObservableCollection<string>,Exception> ac) { svr = new Service1Client(); svr.GetListAsync(ac); svr.GetListCompleted += new EventHandler<GetListCompletedEventArgs>(svr_GetListCompleted); }在上述方法中,方法的第一行创建 WCF 客户端类的实例。
第二行代码调用“GetListAsync”方法,该方法由 Visual Studio 生成,并且是 WCF Client 类的一部分。此方法由我们之前讨论的 WCF 服务的“GetList”生成。“ac”被传递为参数,它是一个用于回调的方法,即它是 XAML.CS 方法,它会更改 UI。
第三行代码设置事件处理程序,该处理程序负责 WCF 服务执行完成的事件。
svr_GetListCompleted 当 WCF 服务完成执行并返回对服务进行的异步调用的响应时,将调用以下方法。
void svr_GetListCompleted(object sender, GetListCompletedEventArgs e) { try { ObservableCollection<string> str = e.Result as ObservableCollection<string>; Deployment.Current.Dispatcher.BeginInvoke( (Action)(() => { (e.UserState as Action<ObservableCollection<string>, Exception>)(str, null); })); } catch (Exception ex) { Deployment.Current.Dispatcher.BeginInvoke( (Action)(() => { (e.UserState as Action<ObservableCollection<string>, Exception>)(null, ex); })); } finally { svr.GetListCompleted -= svr_GetListCompleted; svr.CloseAsync(); svr = null; } }在上述方法中,在 try 块中,第一行获取执行结果,即从 WCF 服务返回的产品列表。
现在,在 try 块中的第二行代码中,Dispatcher 调用 UI 的方法,该方法的引用由“GetListAsync”作为对象传递。
在 Catch 块中,如果在执行期间发生任何异常,它将被发送到 UI 方法以显示给用户。
在 Finally 块中,它会删除 complete 处理程序和 closeAsync 调用,并将 WCF 客户端类对象设置为 null。
注意:您会找到一个类似的方法用于按钮单击和选择产品列表中的产品。
页面 CS 文件
public MainPage() { InitializeComponent(); LoadList(); }方法中的第一行初始化页面组件,第二行代码调用以填充产品列表。
private void LoadList() { WCFProxy proxy = new WCFProxy(); proxy.GetData(new Action<ObservableCollection<string>, Exception>(DispalyList)); }此方法创建前面讨论过的 Proxy 类的对象,并调用其“GetData”方法,并传递名为“DisplayList”的函数的引用。
public void DispalyList(ObservableCollection<string> data, Exception ex) { if (ex == null) listBox1.ItemsSource = data; }此方法中的代码在调用 WCF 服务完成后用项目填充 Listbox。
下面的代码与填充产品列表代码相同,但此代码实际上在产品列表中选择项目,这些项目是通过调用 WCF 服务实际获取的。这会在 UI 的按钮单击时调用。
private void button1_Click(object sender, RoutedEventArgs e) { WCFProxy proxy = new WCFProxy(); proxy.GetDataSelected(new Action<ObservableCollection<string>, Exception>(SelecteItems)); } public void SelecteItems(ObservableCollection<string> data, Exception ex) { if (ex == null) { foreach (string s in data) listBox1.SelectedItems.Add(s); } }
主 xaml
以下是应用程序 UI 的 XAML 代码。
<UserControl x:Class="BusinessApplication1.MainPage" xmlns="<a href="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> http://schemas.microsoft.com/winfx/2006/xaml/presentation</a>" xmlns:x="<a href="http://schemas.microsoft.com/winfx/2006/xaml"> http://schemas.microsoft.com/winfx/2006/xaml</a>" xmlns:navigation="clr-namespace:System.Windows.Controls;assembly =System.Windows.Controls.Navigation" xmlns:uriMapper="clr-namespace:System.Windows.Navigation;assembly =System.Windows.Controls.Navigation" xmlns:dataControls="clr-namespace:System.Windows.Controls;assembly= System.Windows.Controls.Data.DataForm.Toolkit" xmlns:d="<a href="http://schemas.microsoft.com/expression/blend/2008"> http://schemas.microsoft.com/expression/blend/2008</a>" xmlns:mc="<a href="http://schemas.openxmlformats.org/markup-compatibility/2006"> http://schemas.openxmlformats.org/markup-compatibility/2006</a>" mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480"> <Grid x:Name="LayoutRoot" > <ListBox Height="149" HorizontalAlignment="Left" Margin="152,12,0,0" Name="listBox1" VerticalAlignment="Top" Width="182" /> <TextBlock Height="23" HorizontalAlignment="Left" Margin="39,30,0,0" Name="textBlock1" Text="List of Item" VerticalAlignment="Top" /> <Button Content="Select Item beloging to user" Height="23" HorizontalAlignment="Left" Margin="152,186,0,0" Name="button1" VerticalAlignment="Top" Width="182" Click="button1_Click" /> </Grid> </UserControl>
结论
因此,这有助于使用 Dispatcher 构建更具响应性的 Silverlight 应用程序。
如果您有任何疑问或喜欢本文,请留下评论。最好通过运行演示代码来阅读文章。