silverlight学习之路(2)异步编程趋于同步 利用async和await调用wcf服务

   首先非常感谢张伟文老师。博客地址:http://www.cnblogs.com/lemontea/archive/2012/12/09/2810549.html

   开发环境:VS012+sl5。

    1、首先创建一个sl应用程序(选择  在新的网站中承载silverlight应用程序)客户端项目名称为:SLWCF,服务器端项目名称为:SLWCF.Web

    2、在服务器端项目中,添加wcf服务,这里命名WCFService。

    3、添加自己需要的方法。这里代码如下:

接口:

<p>namespace SLWCF.Web
{
    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IWCFService”。
    [ServiceContract]
    public interface IWCFService
    {
        [OperationContract]
        string GetString1(string p1);</p><p>        [OperationContract]
        string GetString2(string p1, string p2);</p><p>        [OperationContract]
        List<UserInfo> GetAll();</p><p>        [OperationContract]
        UserInfo GetUserById(string id);</p><p>        [OperationContract]
        string UpdateUser(UserInfo user);
    }</p><p>    [DataContract]
    public class UserInfo
    {
        [DataMember]
        public string Id { get; set; }</p><p>        [DataMember]
        public string FirstName { get; set; }</p><p>        [DataMember]
        public string LastName { get; set; }</p><p>        [DataMember]
        public string Email { get; set; }</p><p>        [DataMember]
        public string Phone { get; set; }</p><p>        private static List<UserInfo> _list = new List<UserInfo>
        {
            new UserInfo { Id = Guid.NewGuid().ToString(), Email = "<a target=_blank href="mailto:123@123.com">123@123.com</a>", FirstName = "zhang", LastName = "weiwen", Phone = "110" },
            new UserInfo { Id = Guid.NewGuid().ToString(), Email = "<a target=_blank href="mailto:123@123.com">123@123.com</a>", FirstName = "Lee", LastName = "tom", Phone = "111" },
            new UserInfo { Id = Guid.NewGuid().ToString(), Email = "<a target=_blank href="mailto:124@123.com">124@123.com</a>", FirstName = "Mai", LastName = "Foo", Phone = "112" },
            new UserInfo { Id = Guid.NewGuid().ToString(), Email = "<a target=_blank href="mailto:125@123.com">125@123.com</a>", FirstName = "Xia", LastName = "yuyi", Phone = "113" },
            new UserInfo { Id = Guid.NewGuid().ToString(), Email = "<a target=_blank href="mailto:126@123.com">126@123.com</a>", FirstName = "Xie", LastName = "bar", Phone = "114" },
        };</p><p>        public static List<UserInfo> All()
        {
            return _list;
        }</p><p>        public static UserInfo GetById(string id)
        {
            if (string.IsNullOrWhiteSpace(id))
                throw new ArgumentNullException("id");
            else
            {
                return _list.FirstOrDefault(u => u.Phone == id);
            }
        }</p><p>        public static string Update(UserInfo user)
        {
            if (user == null)
                throw new ArgumentNullException("user");</p><p>            var userToUpdate = _list.FirstOrDefault(u => u.Id == user.Id);
            if (userToUpdate == null)
            {
                return string.Format("Id為{0}的用戶不存在", user.Id);
            }
            else
            {
                _list.Remove(user);
                _list.Add(user);
                return "1";
            }
        }
    }
}</p>

实现类:

  <p>namespace SLWCF.Web
{
    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“WCFService”。
    // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 WCFService.svc 或 WCFService.svc.cs,然后开始调试。
    public class WCFService : IWCFService
    {
        public string GetString1(string p1)
        {
            return "您输入的参数:" + p1;
        }</p><p>        public string GetString2(string p1, string p2)
        {
            return "第一个参数:" + p1 + ",第二个参数:" + p2;
        }</p><p>        public List<UserInfo> GetAll()
        {
            return UserInfo.All();
        }</p><p>        public UserInfo GetUserById(string id)
        {
            return UserInfo.GetById(id);
        }</p><p>        public string UpdateUser(UserInfo user)
        {
            return UserInfo.Update(user);
        }
    }
}</p>

    4、在客户端项目中添加服务引用,这里命名为WCFService。

    5、在客户端项目中添加一个类,这里命名为Task。

自动生成代码:

<p>namespace SLWCF
{
    public class Task
    {</p><p>    }
}</p>

修改为:(重写一遍服务器端的方法)

<p>namespace SLWCF.WCFService
{
    public partial class WCFServiceClient
    {
        public Task<String> GetString1TaskAsync(string p1)
        {
            return Task<String>.Factory.FromAsync(this.Channel.BeginGetString1, this.Channel.EndGetString1, p1, null);
        }</p><p>        public Task<String> GetString2TaskAsync(string p1, string p2)
        {
            return Task<String>.Factory.FromAsync(this.Channel.BeginGetString2, this.Channel.EndGetString2, p1, p2, null);
        }</p><p>        public Task<ObservableCollection<UserInfo>> GetAllTaskAsync()
        {
            return Task<ObservableCollection<UserInfo>>.Factory.FromAsync(this.Channel.BeginGetAll, this.Channel.EndGetAll, null);
        }
        public Task<UserInfo> GetUserByIdTaskAsync(String id)
        {
            return Task<UserInfo>.Factory.FromAsync(this.Channel.BeginGetUserById, this.Channel.EndGetUserById, id, null);
        }</p><p>        public Task<String> UpdateUserTaskAsync(UserInfo user)
        {
            return Task<String>.Factory.FromAsync(this.Channel.BeginUpdateUser, this.Channel.EndUpdateUser, user, null);
        }
    }
}</p>

   6、在主页MainPage.xaml添加五个button来调用五个方法,并且分别添加单击事件。

前台代码:

<p><UserControl x:Class="SLWCF.MainPage"
    xmlns="<a target=_blank href="http://schemas.microsoft.com/winfx/2006/xaml/presentation">http://schemas.microsoft.com/winfx/2006/xaml/presentation</a>"
    xmlns:x="<a target=_blank href="http://schemas.microsoft.com/winfx/2006/xaml">http://schemas.microsoft.com/winfx/2006/xaml</a>"
    xmlns:d="<a target=_blank href="http://schemas.microsoft.com/expression/blend/2008">http://schemas.microsoft.com/expression/blend/2008</a>"
    xmlns:mc="<a target=_blank href="http://schemas.openxmlformats.org/markup-compatibility/2006">http://schemas.openxmlformats.org/markup-compatibility/2006</a>"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400"></p><p>    <Grid x:Name="LayoutRoot" Background="White">
        <Button x:Name="btn_GetString1" Content="测试方法:GetString1" HorizontalAlignment="Left" Margin="160,37,0,0" VerticalAlignment="Top" Click="btn_GetString1_Click"/></p><p>        <Button x:Name="btn_GetString2" Content="测试方法:GetString2" HorizontalAlignment="Left" Margin="160,96,0,0" VerticalAlignment="Top" Click="btn_GetString2_Click"/></p><p>        <Button x:Name="btn_GetAll" Content="测试方法:GetAll" HorizontalAlignment="Left" Margin="160,160,0,0" VerticalAlignment="Top" Click="btn_GetAll_Click"/></p><p>        <Button x:Name="btn_GetUserById" Content="测试方法:GetUserById" HorizontalAlignment="Left" Margin="160,216,0,0" VerticalAlignment="Top" Click="btn_GetUserById_Click"/></p><p>        <Button x:Name="btn_UpdateUser" Content="测试方法:UpdateUser" HorizontalAlignment="Left" Margin="160,268,0,0" VerticalAlignment="Top" Click="btn_UpdateUser_Click"/></p><p>    </Grid>
</UserControl></p>

后台代码:

<p>using SLWCF.WCFService;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;</p><p>namespace SLWCF
{
    public partial class MainPage : UserControl
    {
        private readonly WCFServiceClient client = new WCFServiceClient();
        public MainPage()
        {
            InitializeComponent();
        }</p><p>        private async void btn_GetString1_Click(object sender, RoutedEventArgs e)
        {
            string ret = await client.GetString1TaskAsync("qq");
            MessageBox.Show(ret);
        }</p><p>        private async void btn_GetString2_Click(object sender, RoutedEventArgs e)
        {
            string ret = await client.GetString2TaskAsync("qq", "QQ");
            MessageBox.Show(ret);
        }</p><p>        private async void btn_GetAll_Click(object sender, RoutedEventArgs e)
        {
            ObservableCollection<UserInfo> list = await client.GetAllTaskAsync();
            string strShow = "共有" + list.Count + "名用户\n";
            for (int i = 0; i < list.Count; i++)
            {
                strShow += "第" + (i + 1) + "名用户 ID:" + list[i].Id + "姓名:" + list[i].LastName + "邮箱:" + list[i].Email + "电话:" + list[i].Phone + "\n";
            }
            MessageBox.Show(strShow);
        }</p><p>        private async void btn_GetUserById_Click(object sender, RoutedEventArgs e)
        {
            UserInfo user = await client.GetUserByIdTaskAsync("110");
            string strShow = "ID:" + user.Id + "姓名:" + user.LastName + "邮箱:" + user.Email + "电话:" + user.Phone + "\n";
            MessageBox.Show(strShow);
        }</p><p>        private async void btn_UpdateUser_Click(object sender, RoutedEventArgs e)
        {
            string ret = await client.UpdateUserTaskAsync(new UserInfo { Id = Guid.NewGuid().ToString(), Email = "<a target=_blank href="mailto:1@1.com">1@1.com</a>", FirstName = "zhang", LastName = "weiwen", Phone = "114" });
            MessageBox.Show(ret);
        }
    }
}</p>

此刻会出现如下图的错误提示:



这时要做一些简单的处理,选择  “工具”中的“扩展和更新”查看是否已经安装“NuGet程序包管理器”。如果没有安装,先安装它。安装成功之后,选择“工具”中的“NuGet程序包管理器”中的“管理解决方案的NuGet程序包(N)...”,如下图:

右上角搜索框键入“async”,搜索结果如下图:

点击安装第一个搜索结果。安装成功之后,上面的问题已经解决。如下图:

    开始调试。初始界面如下图:

分别点击五个按钮,运行效果截图如下:

   对于本文中的Task.cs类  不是很了解,也没有更好的方法,直接按找张伟文老师的写的。如果那位大神有更好的方法,请不吝赐教。谢谢。

代码下载地址:http://download.csdn.net/detail/duyelang/7889735

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值