发布于 2016-07-03 22:47:51 | 169 次阅读 | 评论: 0 | 来源: 网友投递

这里有新鲜出炉的精品教程,程序狗速度看过来!

Microsoft Silverlight

Microsoft Silverlight是一个跨浏览器的、跨平台的插件,为网络带来下一代基于.NET Framework的媒体体验和丰富的交互式应用程序。Silverlight提供灵活的编程模型,并可以很方便地集成到现有的网络应用程序中。Silverlight可以对运行在Mac或Windows上的主流浏览器提供高质量视频信息的快速、低成本的传递。


如何建立web服务并引用的细节,不是本文的介绍的目标,不再赘述。在silverlight调用服务器端服务的时候,默认情况下是进行异步调用的
代码如下:
 
private void button2_Click(object sender, RoutedEventArgs e) 
{ 
Service1Client sc = new Service1Client(); 
sc.DoWorkCompleted += new EventHandler<DoWorkCompletedEventArgs>(sc_DoWorkCompleted); 
sc.DoWorkAsync(textBox1.Text); 
} 
void sc_DoWorkCompleted(object sender, DoWorkCompletedEventArgs e) 
{ 
textBox2.Text = e.Result; 
} 

若是你的调用非常复杂的话,比如当这个调用完成的时候开始下一个调用,然后又进行下一个调用,各个调用之间存在关联关系的话,一直XX_DoWorkCompleted会让你头大,并且不利于代码的管理。若碰到过这样的问题的朋友一定很希望如果能够同步调用就好了,这篇文章将帮到你。或者现在不需要,等你需要的时候记得用就行了,别像我当初那样难为的不行。

主要是需要引用一个类库的问题,这个类库是外国人写的,名称为DanielVaughan.dll,下载完之后,首先需要在项目中添加对它的引用,如下图,

然后在程序中添加对两个空间的引用,如下图:



将原来的添加botton1事件:

 
private void button1_Click(object sender, RoutedEventArgs e) 
{ 
string dd = textBox1.Text; 
string res = "NULL"; 
ThreadPool.QueueUserWorkItem(delegate 
{ 
Service1 sv = ChannelManager.Instance.GetChannel<Service1>(); 
/* Perform synchronous WCF call. */ 
res = SynchronousChannelBroker.PerformAction<string, string>(sv.BeginDoWork, sv.EndDoWork, dd); 
Dispatcher.BeginInvoke(delegate 
{ 
textBox2.Text +="\r\n同步调用--"+ res+"\r\n"; 
}); 
}); 
} 

这样就可以实现对WebClient的同步调用了,当你需要关联调用WebClient3次以上的时候 可以考虑使用这个类库,如果只是简单的调用下的话,没有必要使用。
页面全部代码:
 
<UserControl x:Class="SilverlightApplication2.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
d:DesignHeight="300" d:DesignWidth="400" xmlns:dataInput="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Input" Width="640" Height="480"> 
<Grid x:Name="LayoutRoot"> 
<Grid.Background> 
<LinearGradientBrush EndPoint="0.443,0.621" StartPoint="0.443,-2.509"> 
<GradientStop Color="#FF5C6768"/> 
<GradientStop Color="White" Offset="1"/> 
</LinearGradientBrush> 
</Grid.Background> 
<Button Content="同步调用服务" Height="40" HorizontalAlignment="Left" Margin="67,98,0,0" Name="button1" VerticalAlignment="Top" Width="120" Click="button1_Click" /> 
<dataInput:Label Height="50" HorizontalAlignment="Left" Margin="67,188,0,0" Name="label2" VerticalAlignment="Top" Width="46" Content="状态:" FontSize="16" /> 
<TextBox Height="40" HorizontalAlignment="Left" Margin="165,27,0,0" Name="textBox1" VerticalAlignment="Top" Width="300" FontSize="16" /> 
<TextBox Height="100" HorizontalAlignment="Left" Margin="146,188,0,0" Name="textBox2" VerticalAlignment="Top" Width="400" FontSize="16" TextWrapping="Wrap" Text="尚未调用服务" /> 
<Button Content="异步调用服务" Height="40" HorizontalAlignment="Left" Margin="346,98,0,0" Name="button2" VerticalAlignment="Top" Width="120" Click="button2_Click" /> 
<dataInput:Label Height="40" HorizontalAlignment="Left" Margin="67,27,0,0" Name="label1" VerticalAlignment="Top" Width="92" FontSize="16" Content="输入文本:" /> 
</Grid> 
</UserControl> 

处理程序全部代码:
 
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; 
using SilverlightApplication2.ServiceReference1; 
using System.Threading; 
using DanielVaughan; 
namespace SilverlightApplication2 
{ 
public partial class MainPage : UserControl 
{ 
public MainPage() 
{ 
InitializeComponent(); 
UISynchronizationContext.Instance.Initialize(Dispatcher); 
} 
private void button1_Click(object sender, RoutedEventArgs e) 
{ 
string dd = textBox1.Text; 
string res = "NULL"; 
ThreadPool.QueueUserWorkItem(delegate 
{ 
Service1 sv = ChannelManager.Instance.GetChannel<Service1>(); 
/* Perform synchronous WCF call. */ 
res = SynchronousChannelBroker.PerformAction<string, string>(sv.BeginDoWork, sv.EndDoWork, dd); 
Dispatcher.BeginInvoke(delegate 
{ 
textBox2.Text +="\r\n同步调用--"+ res+"\r\n"; 
}); 
}); 
} 
private void button2_Click(object sender, RoutedEventArgs e) 
{ 
Service1Client sc = new Service1Client(); 
sc.DoWorkCompleted += new EventHandler<DoWorkCompletedEventArgs>(sc_DoWorkCompleted); 
sc.DoWorkAsync(textBox1.Text); 
} 
void sc_DoWorkCompleted(object sender, DoWorkCompletedEventArgs e) 
{ 
textBox2.Text += "异步调用--" + e.Result + "\r\n"; 
} 
} 
} 

Service代码:
 
using System; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.ServiceModel.Activation; 
namespace SilverlightApplication2.Web 
{ 
[ServiceContract(Namespace = "")] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class Service1 
{ 
[OperationContract] 
public string DoWork(string aa) 
{ 
// 在此处添加操作实现 
return "调用服务完成,返回你输入的值:"+aa; 
} 
// 在此处添加更多操作并使用 [OperationContract] 标记它们 
} 
} 

程序运行截图:

1.

2.

3.




欢迎大家共同探讨,觉得好的话请推荐下。本人技术水平有限,如有不足之处,还请园友多多批评指正,谢谢。



最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务