大佬教程收集整理的这篇文章主要介绍了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。
接口:
<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。
<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://scheR_310_11845@as.microsoft.com/winfx/2006/xaml/presentation">http://scheR_310_11845@as.microsoft.com/winfx/2006/xaml/presentation</a>" xmlns:x="<a target=_blank href="http://scheR_310_11845@as.microsoft.com/winfx/2006/xaml">http://scheR_310_11845@as.microsoft.com/winfx/2006/xaml</a>" xmlns:d="<a target=_blank href="http://scheR_310_11845@as.microsoft.com/expression/blend/2008">http://scheR_310_11845@as.microsoft.com/expression/blend/2008</a>" xmlns:mc="<a target=_blank href="http://scheR_310_11845@as.openxmlformats.org/markup-compatibility/2006">http://scheR_310_11845@as.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>
点击安装第一个搜索结果。安装成功之后,上面的问题已经解决。如下图:
开始调试。初始界面如下图:
分别点击五个按钮,运行效果截图如下:
@H_618_143@
对于本文中的Task.cs类 不是很了解,也没有更好的方法,直接按找张伟文老师的写的。如果那位大神有更好的方法,请不吝赐教。谢谢。
以上是大佬教程为你收集整理的silverlight学习之路(2)异步编程趋于同步 利用async和await调用wcf服务全部内容,希望文章能够帮你解决silverlight学习之路(2)异步编程趋于同步 利用async和await调用wcf服务所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。