Silverlight中同步调用WebClient的解决办法,是同步!

如何建立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,下载完之后,首先需要在项目中添加对它的引用,如下图,

2011040717103436.jpg

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

2011040717210792.jpg

将原来的添加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.

2011040717441873.jpg

2.
 

2011040717442962.jpg

3.

2011040717445965.jpg



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


 

转载于:https://www.cnblogs.com/shiyue/archive/2011/04/07/2008191.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值