Silverlight中同步调用WebClient的解决办法,是同步!_实用技巧

代码如下:

复制代码 代码如下:

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.

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

时间: 2024-09-15 04:13:30

Silverlight中同步调用WebClient的解决办法,是同步!_实用技巧的相关文章

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

代码如下: 复制代码 代码如下: 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_

HTTP 错误 500.19 - Internal Server Error解决办法详解_实用技巧

HTTP 错误 500.19 - Internal Server Error 最近做项目出现了这个错误,经过同事之间的讨论未能解决,之后百度一下找到了解决方法,这里就说下希望大家遇到这种错误可以顺利解决. 无法访问请求的页面,因为该页的相关配置数据无效.如下图:  解决方法,到站点目录的属性,安全标签,添加用户(Everyone),并给修改权限: 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

在ASP.NET中支持断点续传下载大文件(ZT)源码_实用技巧

IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头. 一. 两个必要响应头Accept-Ranges.ETag 客户端每次提交下载请求时,服务端都要添加这两个响应头,以保证客户端和服务端将此下载识别为可以断点续传的下载: Accept-Ranges:告知下载客户端这是一个可以恢复续传的下载,存放本次下载的开始字节位置.文件的字节大小: ETag:保存文件的唯一标识(我在用的文件名+文件最后修改时间,以便续传请求时对文件进行验证): Las

.net实现oracle数据库中获取新插入数据的id的方法_实用技巧

在sql sever中实现插入数据的自动增长是很容易的,但是在oracle数据库中实现这一操作不是很容易,同时要想在.net中实现获取新插入数据的id,而且不会出现读错的情况,就更显得困难了,为了解决在oracle数据中插入的数据能够自增id,同时获取新数据的id,并避免因并发操作而出现的id读错的问题. 数据表结构为test(id,name) 首先,解决数据id自增问题 创建一个序列sequence(sequence详解可从网上搜一下,这里不赘述) create sequence SEQ_te

asp.net中javascript的引用(直接引入和间接引入)_实用技巧

Asp.net 中引入Javascript 的方法有很多.在做牛腩的时候主要讲了两种. 个人认为可以分为直接引入,和间接引入. 一.直接引入.在前台页面调用自定义的javascript 函数: 1.打开前台页面在 head 元素之间加入 script 元素,将 type 元素设置为 " text/javascript ".然后写javascript自定义的函数. 复制代码 代码如下: <head runat="server"> <script ty

Asp.net页面中调用soapheader进行验证的操作步骤_实用技巧

本文为大家分享了Asp.net页面中调用以SOAP头作验证的web services操作步骤,供大家参考,具体内容如下 第一步:用来作SOAP验证的类必须从SoapHeader类派生,类中Public的属性将出现在自动产生XML节点中,即: <soap:Header> <UserSoapHeader xmlns="http://tempuri.org/"> <UserName>string</UserName> <Pwd>st

解决ASP.NET中Type.GetType方法总返回空的问题_实用技巧

 Type.GetType总是返回NULL;    后来查看,web项目中的引用,发现么有引用对应的项目.. 所以,应用程序无法在web项目中找到对应的dll.. 添加一个引用就解决了.... 额...不知道怎么说通顺些 举个例子 如:Type.GetType("System.String") //这个是没问题的,因为System.String在mscorlib.dll中 下边我要获取MyProject.Data.SqlServerDAL Type.GetType("MyPr

卡巴WININET.DLL 木马的解决办法和措施_应用技巧

在选择清除木马后,电脑重启后无法进入桌面!请大家在卡巴报警时暂时千万不要将其删除!!  如果遇到监控一直报警的可以暂时退出卡巴!  上网搜索之后,这个现象是由于卡巴误报WININET.DLL 为木马,删除导致的现象就是进入操作系统之后进入不了桌面,  可能还导致很多应用程序无法运行,可是发现网上给出的方法并不能完全解决所有问题,因为卡巴启动时默认是隐藏主界面的!  经过试验,现给出一个最为管用的解决方法:  首先下载附件中的 WININET.rar 文件,解压后得到WININET.DLL 并将其

asp.net中调用winrar实现压缩解压缩的代码_实用技巧

asp.net压缩文件夹调用示例:rar("e:/www.jb51.net/", "e:/www.jb51.net.rar"); asp.net解压缩rar文件调用示例:unrar("e:/www.jb51.net.rar", "e:/"); 复制代码 代码如下: using System; using System.Collections.Generic; using System.Text; using System.Di