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

 更新时间:2011年04月07日 18:47:42   作者:  
如何建立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.




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

相关文章

  • 如何给asp.net core写个中间件记录接口耗时

    如何给asp.net core写个中间件记录接口耗时

    这篇文章主要给大家介绍了关于如何给asp.net core写个中间件记录接口耗时的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用asp.net core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • 灵活掌握Asp.net MVC中GridView的使用方法

    灵活掌握Asp.net MVC中GridView的使用方法

    这篇文章主要帮助大家灵活掌握Asp.net MVC中GridView的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • .NET下为百度文本编辑器UEditor增加图片删除功能示例

    .NET下为百度文本编辑器UEditor增加图片删除功能示例

    今天下载了目前最新版1.2.5为版本看更新记录,主要是对表格做个修改,我下载用上,上传图片的删除功能给取消了,下面与大家分享下增加图片删除功能示例
    2013-05-05
  • ASP.NET实现从服务器下载文件问题处理

    ASP.NET实现从服务器下载文件问题处理

    本文主要介绍了ASP.NET实现从服务器下载文件问题处理,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • OpenCms 带分页的新闻列表

    OpenCms 带分页的新闻列表

    有一些网友在新闻列表分页上还遇到一些问题,正好这个blog上也忘记了此部分内容,现在补充上,功能是实现了,可以自己再做些优化,OpenCms7.0.5下测试通过,内容如下(编辑器的插入代码功能有问题,就直接把代码粘上了
    2008-07-07
  • ASP.NET Eval进行数据绑定的方法

    ASP.NET Eval进行数据绑定的方法

    ASP.NET Eval在数据绑定方面的应用是众所周知的,不过技术在发展,当ASP.NET Eval 1.1变成ASP.NET Eval 2.0的时候,在操作的时候会有什么变化呢?
    2013-04-04
  • 详解ASP.NET Core3.0 配置的Options模式

    详解ASP.NET Core3.0 配置的Options模式

    这篇文章主要介绍了详解ASP.NET Core3.0 配置的Options模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • .net平台推送ios消息的实现方法

    .net平台推送ios消息的实现方法

    这篇文章主要介绍了.net平台推送ios消息的实现方法,详细讲述了各个具体的实现步骤并附有源码供大家参考之用,需要的朋友可以参考下
    2014-10-10
  • asp.net发送邮件实现方法

    asp.net发送邮件实现方法

    这篇文章主要介绍了asp.net发送邮件实现方法,以一个具体实例的形式详细讲述了asp.net发送邮件的技巧,需要的朋友可以参考下
    2014-10-10
  • 获取转向地址的URL的源文件(可自定义REFER)

    获取转向地址的URL的源文件(可自定义REFER)

    获取转向地址的URL的源文件(可自定义REFER)...
    2006-09-09

最新评论