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

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

概述   首先非常感谢张伟文老师。博客地址:http://www.cnblogs.com/lemontea/archive/2012/12/09/2810549.html。    开发环境:VS012+sl5。     1、首先创建一个sl应用程序(选择  在新的网站中承载silverlight应用程序)客户端项目名称为:SLWCF,服务器端项目名称为:SLWCF.Web     2、在服务器端项目中

   首先非常感谢张伟文老师。博客地址: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(),Firstname = "Lee",Lastname = "tom",Phone = "111" },Email = "<a target=_blank href="mailto:124@123.com">124@123.com</a>",Firstname = "Mai",Lastname = "Foo",Phone = "112" },Email = "<a target=_blank href="mailto:125@123.com">125@123.com</a>",Firstname = "Xia",Lastname = "yuyi",Phone = "113" },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,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" VerticalAlignment="top" Click="btn_GetString1_Click"/></p><p>        <button x:name="btn_GetString2" Content="测试方法:GetString2" HorizontalAlignment="left" margin="160,96,0" VerticalAlignment="top" Click="btn_GetString2_Click"/></p><p>        <button x:name="btn_GetAll" Content="测试方法:GetAll" HorizontalAlignment="left" margin="160,160,0" VerticalAlignment="top" Click="btn_GetAll_Click"/></p><p>        <button x:name="btn_GetUserByID" Content="测试方法:GetUserByID" HorizontalAlignment="left" margin="160,216,0" VerticalAlignment="top" Click="btn_GetUserByID_Click"/></p><p>        <button x:name="btn_UpdateUser" Content="测试方法:UpdateUser" HorizontalAlignment="left" margin="160,268,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>",Phone = "114" });            MessageBox.Show(ret);        }    }}</p>

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



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

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

@H_502_69@

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

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

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

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

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

总结

以上是内存溢出为你收集整理的silverlight学习之路(2)异步编程趋于同步 利用async和await调用wcf服务全部内容,希望文章能够帮你解决silverlight学习之路(2)异步编程趋于同步 利用async和await调用wcf服务所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1013347.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存