手机
当前位置:查字典教程网 >编程开发 >asp.net教程 >Silverlight中同步调用WebClient的解决办法,是同步!
Silverlight中同步调用WebClient的解决办法,是同步!
摘要:代码如下:复制代码代码如下:privatevoidbutton2_Click(objectsender,RoutedEventArgse){...

代码如下:

复制代码 代码如下:

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

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

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

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

将原来的添加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 +="rn同步调用--"+ res+"rn";

});

});

}

这样就可以实现对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 +="rn同步调用--"+ res+"rn";

});

});

}

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 + "rn";

}

}

}

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.

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

2.

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

3.

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

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

【Silverlight中同步调用WebClient的解决办法,是同步!】相关文章:

Asp.net下载功能的解决方案代码

iis 服务器应用程序不可用的解决方法

ASP.NET 页面中加添加用户控件的写法

用.Net的File控件上传文件的解决方案

asp.net2.0中css失效的解决方法

ASP.Net中防止刷新自动触发事件的解决方案

ASP.NET 中文显示之两种解决方法

HTTP协议下用Web Service上传大文件的解决方案

Jmail发送邮件与带附件乱码解决办法分享

二级域名Cookie问题的解决方法

精品推荐
分类导航