65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.85/5 (6投票s)

2012 年 12 月 27 日

CPOL

4分钟阅读

viewsIcon

33795

downloadIcon

830

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

本文介绍了 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 上调用完成,您可以看到产品列表已填充。
public List<string> GetList()
{
    List<string> lst = new List<string>
                {"Product1","Product2","Product3","Product4","Product5"};
    return lst;
}
GetSelectedList - 此方法获取所选产品的列表,当用户按下 UI 上的按钮时,这些产品将被突出显示。
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 应用程序。

如果您有任何疑问或喜欢本文,请留下评论。最好通过运行演示代码来阅读文章。
© . All rights reserved.