SilverLight学习笔记--Silverligh之BackgroundWorker类的应用
- 格式:docx
- 大小:59.35 KB
- 文档页数:9
一步一步学Silverlight 2系列(14):数据与通信之WCF概述Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython,对JSON、Web Service、WCF 以及Sockets的支持等一系列新的特性。
《一步一步学Silverlight 2系列》文章将从Silverlight 2基础知识、数据与通信、自定义控件、动画、图形图像等几个方面带您快速进入Silverlight 2开发。
本文将简单介绍在Silverlight 2中如何与WCF进行通信。
简单示例在本示例中,我们将通过WCF来获取一个最新随笔的列表,在Silverlight中显示出来,最终完后效果如下所示。
先定义一个数据契约:在Web项目中添加一个WCF Service文件,命名为Blog.svc 定义服务契约:实现服务,这里可以是从数据库或者其他数据源读取,为了演示方便,我们直接初始化一个集合:修改Web.config中的服务配置,这里使用basicHttpBinding绑定,并且开启httpGetEnabled,以便后面我们可以在浏览器中查看服务:设置一下Web应用程序的端口号为固定端口52424,在浏览器中输入http://localhost:52424/ Blog.svc,看看服务是否正常:好了,现在服务端我们就实现完成了。
现在编写界面展示部分,XAML如下:在Silverlight项目中添加服务引用,输入地址http://localhost:52424/Blog.svc,输入命名空间BlogService。
添加完成后,我们可以在对象浏览器中浏览一下生成的客户端对象:当然大家也可以手工去编写客户端的代码,请参考WCF的相关内容,这里不再赘述。
下面编写调用服务并获取数据,这里仍然是采用异步模式,由于在WCF服务的配置中我们采取了BasicHttpBinding,客户端也要采用BasicHttpBinding。
一.Silverlight学习 (2)1.1 Silverlight概述 (2)1.2 Silverlight 结构 (3)1.2.1 Silverlight平台 (3)1.2.2 Silverlight 结构 (3)1.2.3 核心表示层组件 (4)1.2.4 NET Framework for Silverlight (4)1.2.5 附加Silverlight 编程功能 (5)1.3 Silverlight 3.0 环境的搭建 (6)二.开始第一个Silverlight工程 (6)2.1 Silverlight 应用程序项目文件 (8)2.1.1 Silverlight 应用程序项目包含以下配置、程序集引用和代码文件: (8)2.1.2 Silverlight 应用程序项目将包含对以下程序集的引用: (8)2.2 工程示例 (9)2.2.1 Silverlight工程的独立运行 (11)2.2.2 Silverlight中XAML页面的导航 (11)三.Silverlight的特点分析 (12)3.1 Silverlight 3概述 (13)3.2 Silverlight 3 特点之增强媒体特性 (13)3.3 Silverlight 3特性之强化丰富的体验 (14)3.4 Silverlight 3特性之提高富互联网应用的效率 (14)3.5 Silverlight 3增强特性之其它 (15)3.6 Expression Blend 3中的新特性 (15)四.Deep Zoom Composer (16)4.1 Deep Zoom技术原理简介 (16)4.2 开始第一个Deep Zoom Composer应用 (17)4.2.1 建立Deep Zoom图片 (18)4.2.2 将Deep Zoom图片添加到Silverlight工程 (20)4.3 Deep Zoom Composer正式版的特点分析 (21)4.3.1 Deep Zoom Composer正式版的特点之容易的交互式Deep Zoom体验 (22)4.3.2 Deep Zoom Composer正式版的特点之追踪分析 (22)4.3.3 Deep Zoom Composer正式版的特点之增强的DeepZoomPix播放器 (23)4.3.4 Deep Zoom Composer正式版的特点之让你的导出走得更远 (24)4.3.5 Deep Zoom Composer正式版的特点之更新的UI (24)4.3.6 Deep Zoom Composer正式版的特点之支持Smooth Streaming (24)五.JSON-RPC (25)5.1 JSON数据格式 (25)5.2 JSON数据格式转换 (25)5.2.1 JSON在java中的数据转换 (25)5.2.2 JSON数据格式在Silverlight中的转换 (26)5.3 JSON-RPC (27)5.3.1 JSON传输协议 (27)5.3.2 Silverlight对基于Http的服务发出请求 (27)一.Silverlight学习1.1Silverlight概述Microsoft Silverlight 是一种跨浏览器、跨平台的.NET Framework 实现,用于为Web 生成和提供下一代媒体体验和丰富的交互式应用程序(RIA)。
JSON是一种轻量级的数据传输类型,它可以通过序列化把一个简单对象转换为一个简单的字符串,在网络中进行传输,然后在客户端进行反序列化,得到原始对象.功能上和XML差不多,只是它的体积小,在客户端解析方便,所以被广泛使用.我们可以使用Silverlight提供的三个类来完成JSON数据的传递和接收。
它们是:1、DataContractJsonSerializer (位于 System.Runtime.Serialization. Json)2、JsonObject (位于System.Json,将JSON数据流转换成为可读写的对象)3、JsonArray (位于System.Json, 对JSON数据流转换成为JsonObject数组形式,可支持LINQ查询)注:如果要引用System.Runtime.Serialization.Json名空间里的Json,则必须也引用System.ServiceModel,否则Json会无法使用。
在本例中,我们将使用它来进行示例。
下面我们一起来学习在Silverlight中如何从服务器端向客户端传递Json数据。
新建一个Silverlight应用程序。
命名为:SLJson(一)准备工作在这里,我们完成三种情况的Json数据传递。
1、一个Person类(其属性均为简单类型:String类型)2、Customers类,它是Person类的一个List。
3、一个PersonT类(它包含另一个类 Address)我们要传递这三种情况的类对象实例到客户端并显示出来。
所以,在此,我们首先要在服务器端和客户端分别建立上面的三个类。
Person类服务器端代码定义如下:using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Runtime.Serialization;//要引用System.Runtime.Serializati on.Dll才能使用[DataContract]与[DataMember]属性namespace SLJson.Web{[DataContract]public class Person{[DataMember]public string Name { get; set; }[DataMember]public int Age { get; set; }[DataMember]public string Address { get; set; }}}客户端代码定义如下:using System;using ;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Ink;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;namespace SLJson{public class Person{public string Name { get; set; }public int Age { get; set; }public string Address { get; set; }}}Customers类服务器端代码定义如下:using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Runtime.Serialization; //要引用System.Runtime.Serializat ion.Dll才能使用[DataContract]与[DataMember]属性namespace SLJson.Web{[DataContract]public class Customers{[DataMember]public List<Person> Persons { get; set; }}}客户端代码定义如下:using System;using ;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Ink;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;using System.Collections.Generic; //要引入此空间以使用Listnamespace SLJson{public class Customers{public List<Person> Persons { get; set; }}}PersonT类服务器端代码定义如下:using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Runtime.Serialization;//要引用System.Runtime.Serializati on.Dll才能使用[DataContract]与[DataMember]属性namespace SLJson.Web{[DataContract]public class PersonT{[DataMember]public string Name { get; set; }[DataMember]public int Age { get; set; }[DataMember]public Address Address { get; set; }}}客户端代码定义如下:using System;using ;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Ink;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;namespace SLJson{public class PersonT{public string Name { get; set; }public int Age { get; set; }public Address Address { get; set; }}}PersonT类内含的Address类服务器端代码定义如下:using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Runtime.Serialization;//要引用System.Runtime.Serializati on.Dll才能使用[DataContract]与[DataMember]属性namespace SLJson.Web{[DataContract]public class Address{[DataMember]public string country { get; set; }[DataMember]public string city { get; set; }}}客户端代码定义如下:using System;using ;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Ink;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;namespace SLJson{public class Address{public string country { get; set; }public string city { get; set; }}}至此,我们的应用程序如下图:(二) 实现Json数据的传递。
(完整版)SilverLight学习笔记--Silverligh之动态加载程序集(.DLL) 编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整版)SilverLight学习笔记--Silverligh之动态加载程序集(.DLL))的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整版)SilverLight学习笔记--Silverligh之动态加载程序集(.DLL)的全部内容。
(完整版)SilverLight学习笔记-—Silverligh之动态加载程序集(。
DLL)编辑整理:张嬗雒老师尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布到文库,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是我们任然希望(完整版)SilverLight学习笔记-—Silverligh之动态加载程序集(.DLL) 这篇文档能够给您的工作和学习带来便利。
同时我们也真诚的希望收到您的建议和反馈到下面的留言区,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请下载收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为 <(完整版)SilverLight学习笔记--Silverligh之动态加载程序集(。
DLL)〉这篇文档的全部内容.自定义TextEventArgs 事件参数类定义一个接口IEditUI}1。
2、定义用户编辑器类用与定义接口同样的方法,我们添加一个Silverlight类库项目,命名为:Implementation.新建后,解决方案如下图:在编写Implementation类的代码前,我们需要添加引用前面所定义的Interfaces接口,引用界面如图:using System;using ;using System.Windows;using System.Windows.Controls;using System.Windows。
INotifyPropertyChanged是什么,它有什么作用?通过查阅MSDN我们知道,INotifyPropertyChanged 接口用于向客户端(通常是执行绑定的客户端)发出某一属性值已更改的通知。
当绑定数据源的某属性值改变时,它可以通知客户端,并进行界面数据更新.而我们不用写很多复杂的代码来更新界面数据,这样可以做到方法简洁而清晰,INotifyPropertyChanged确实是一个强大的接口。
首先,我们需要了解如下有关Silverlight 2.0 数据绑定的术语:Binding - 将绑定目标对象的属性与数据源联接起来Source - 绑定的数据源Mode - 绑定的数据流的方向 [System.Windows.Data.BindingMode枚举]BindingMode.OneTime - 一次绑定。
创建绑定时一次性地更新绑定目标对象的属性BindingMode.OneWay - 单向绑定(默认值)。
数据源的改变会自动通知到绑定目标对象的属性BindingMode.TwoWay - 双向绑定。
数据源或绑定目标对象的属性的值发生改变时会互相通知。
显然,做数据验证的话一定要是双向绑定INotifyPropertyChanged - 向客户端发出某一属性值已更改的通知IValueConverter - 值转换接口,将一个类型的值转换为另一个类型的值。
它提供了一种将自定义逻辑应用于绑定的方式接下来我们学习简单的数据绑定并了解INotifyPropertyChanged所发挥的作用。
首先启动VS2008,新建Silverlight应用程序,程序名为MyINotifyPropertyChanged,系统自动为我们建立两个项目,一个是MyINotifyPropertyChanged,一个是MyINotifyPropertyChanged.Web。
在MyINotifyPropertyChanged子项目下,我们添加了两类数据源:StudentNotify.cs :引入了INotifyPropertyChanged接口using System;using ;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Ink;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;using ponentModel; //需要添加此命名空间namespace MyINotifyPropertyChanged{public class StudentNotify : INotifyPropertyChanged{private string NameValue;private int AgeValue;public string SName{get { return NameValue; }set{NameValue = value;// Call NotifyPropertyChanged when the property is up datedNotifyPropertyChanged("SName");}}public int SAge{get { return AgeValue; }set{AgeValue = value;// Call NotifyPropertyChanged when the property is up datedNotifyPropertyChanged("SAge");}}// Declare the PropertyChanged eventpublic event PropertyChangedEventHandler PropertyChanged;// NotifyPropertyChanged will raise the PropertyChanged even t passing the// source property that is being updated.public void NotifyPropertyChanged(string propertyName){if (PropertyChanged != null){PropertyChanged(this, new PropertyChangedEventArgs(pr opertyName));}}public StudentNotify(){}public StudentNotify(string NameStr,int AgeInt){SName = NameStr;SAge = AgeInt;}}}Student.cs :没有引入INotifyPropertyChanged接口using System;using ;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Ink;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;namespace MyINotifyPropertyChanged{public class Student{public string SName { get; set; }public int SAge { get; set; }}}对于呈现界面我们设计了两大组基于不同Binding Mode值的TextBox第一组的TextBox其BindingMode值分别为:DefaultOneTimeOneWayTwoWay第二组的TextBox其BindingMode值全部为:TwoWay此外,我们设计了一个ComboBox,用于选择我们将要对上述两组呈现界面进行数据绑定的不同数据源。
自定义 TextEventArgs 事件参数类定义一个接口IEditUI}1.2、定义用户编辑器类用与定义接口同样的方法,我们添加一个Silverlight类库项目,命名为:Implementation。
新建后,解决方案如下图:在编写Implementation类的代码前,我们需要添加引用前面所定义的Interfaces接口,引用界面如图:Implementation项目下的Class1.cs代码如下:using System;using ;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Ink;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;using Interfaces; //需要引用Interfaces接口namespace Implementation{//在此我们定义Editor类,它必须要实现我们前面定义的IEditUI接口public class MyEditor: IEditUI{private TextBox textBox;private TextBlock textBlock;定义并实现IEditUI接口的TextChanged事件MyEditor的构造函数实现IEditUI接口的GetControls方法MyEditor界面中按钮Click事件,在此事件中激发IEditUI接口定义的TextChanged事件实现IEditUI接口的SetText方法}}1.3、进一步准备工作现在我们需要生成解决方案,生成后,我们需要找到Implementation项目的Bin目录下的Debug子目录,在此子目录下找到Implementation.dll,把它拷贝到SLDynamicLoadingAssembly.Web项目的ClientBin下备用(引用)。
Silverlight API学习笔记(一)上一篇/ 下一篇 2010-06-08 13:03:57 / 个人分类:ArcGIS Server查看( 439 ) / 评论( 4 ) / 评分( 0 / 0 )ArcGIS Silverlight API安装资源下载ArcGIS Silverlight API的帮助是在线的,访问的URL为:/en/webapi/silverlight/help/index.html关于如何搭建应用开发环境,可以参照左边的目录树中的Installation,其中包含各种开发资源的下载链接。
在系列教程的第一讲中,我先将本Help中提到的相关资源全部下载整理了一下,放在QQ空间的中转站中。
QQ帐号是:arcgiser@密码是:giser1234567,大家登录QQ邮箱后,直接在文件中转站中可以看到下载链接。
因为这个资源是开放给GISer方便学习用的,请不要随便更改QQ密码。
文件默认的存放时间为7天,如果有人看到即将过期,请帮忙续期一下。
(VS2010实在太大了,就不上传了,大家自己找下载地址吧)这个资源主要包含以下几个,简要介绍如下:(1)Expression Blend 4RC:Expression Blend,是一款用于设计桌面和Web应用用户界面的可视化工具,用户可以通过拖拉控件方式创建用户交互界面,即Expression Blend是一款Silverlight API编程的IDE。
Expression Blend 4RC是4.0 Release Candidate版本。
(2)Silverlight4_Tools如果您是在VS2010中进行ArcGIS Silverlight API开发的话,必须在安装完VS2010之后再安装Silverlight4_tools (/downloads/details.aspx?familyid=BF5AB940-C011-4BD1-AD98-DA 671E491009&displaylang=en)。
控件入门Silverlight控件的设计是一致的。
当了解一种控件类型的基础知识后,使用其他控件就很容易了。
例如,向应用程序添加控件、更改控件外观以及处理控件事件对于所有Silverlight 控件都是类似的。
如果您使用的是Visual Studio 2010,则可以通过用于Visual Studio 的Silverlight 设计器轻松完成所有这些任务。
还可以使用XAML 或代码完成这些任务。
本主题介绍Silverlight 控件之间共享的一些控件任务。
说明:本主题包括下列各节。
∙向应用程序添加控件∙使用属性更改单个控件的外观∙使用样式更改多个控件的外观∙创建控件事件处理程序∙相关主题向应用程序添加控件可以在XAML 或代码中,或通过使用Silverlight 设计器向应用程序添加控件。
如果希望在代码隐藏文件中引用该控件,则必须通过在XAML 声明中使用x:Name 属性为控件指定名称。
有关更多信息,请参见x:Name 属性。
当您使用Silverlight SDK 或Silverlight 工具包中的控件时,必须引用正确的程序集,并且必须在XAML 文件中添加一个命名空间映射。
使用设计器的一个优势是:当您从工具包中拖动控件时,将自动添加程序集引用和命名空间映射。
如果您在XAML 或代码中添加控件,则必须手动添加程序集引用和命名空间映射。
有关XAML 命名空间映射的更多信息,请参见Silverlight XAML 命名空间以及将XAML 命名空间映射为前缀。
使用设计器将控件添加到应用程序1.在“工具包”中,找到要使用的控件。
下图显示Silverlight 工具包的一个示例。
2.双击控件以将其添加到设计图面。
- 或-将控件拖到设计图面上的所需位置。
使用XAML 将控件添加到应用程序1.如果需要,请在解决方案资源浏览器中添加对程序集的引用。
2.如果需要,请在XAML 文件中添加一个命名空间映射。
3.在XAML 中声明控件。
创建您的第一个应用程序我们需要做的第一件事情是启动Visual Studio并创建一个新的项目。
在您启动Visual Studio,选择“新建项目”菜单中选择:文件- >新建- >项目这将打开“新建项目”对话框中。
在左侧的“模板”列表中,选择Visual C#中(Visual Basic中也可),然后Silverlight的。
然后选择“项目类型的Silverlight应用。
现在的名字你的项目的HelloWorld,然后选择确定。
接下来打开的对话框中询问您是否要创建一个新的网站,或简单地用一个测试页。
对于本示例中,取消选择“在一个新的网站主机的Silverlight应用程序”。
我们将使用“测试页”选项。
开发Silverlight应用程序时,在使用“网站”选项有一些好处,但这个例子中,测试页就足够了。
这是有创造一个新的Silverlight项目。
下一步我们将添加一些功能的应用程序。
如果您没有看到解决方案资源管理器(通常在右侧窗口),您可以从“查看” - >“解决方案资源管理器。
在解决方案资源管理器中,有一些项目文件。
我们将在此QuickStart中使用的文件MainPage.xaml 中和MainPage.xaml.cs 。
如果您不熟悉使用XAML,XAML是一种基于XML的声明性语言,用于创建和布局的UI元素。
请参阅XAML快速入门上的XAML的更多信息。
cs文件是在C#代码隐藏文件。
通过局部类代码隐藏文件是同一个XAML文件。
代码隐藏和局部类的更多信息,请参见代码隐藏和分部类MSDN文章。
从代码中分离的用户界面,允许您创建声明XAML标记可见的用户界面元素,然后使用一个单独的代码隐藏文件,以响应事件和操作您在XAML中声明的对象。
这种分离使得它很容易为设计人员和开发人员一起工作,有效地在同一项目。
双击上MainPage.xaml中。
这将在主编辑器窗口中打开MainPage.xaml文件。
Silverlight入门教程--基于运行环境示例郑健2008-3-9(一).概述 (3)(二). 代码示例 (3)1).基础知识示例 (3)1. 对象的定位 (3)2. 使用SilverLight插件 (8)3. SilverLight元素的鼠标事件 (10)4. SilverLight元素的键盘事件 (16)5.方法createFromXaml使用示例 (17)6.访问和修改Silverlight元素以及属性 (19)7. Silverlight中的字体使用 (21)8.全屏支持功能 (24)9. Silverlight Downloader 对象使用 (26)10.定时器功能 (29)11.错误处理支持 (31)12.把xaml段内置在aspx或html页面中 (34)2).制作图形示例 (36)13.基本图形形状示例 (36)14.画刷对象的使用 (38)15.视频刷对象的使用 (41)16.Path元素使用 (43)17.变换效果(Transform) (44)3).多媒体功能 (46)18.在线电影播放 (46)4).制作动画效果示例 (51)19.一个动画示例 (51)20.动画的交互控制 (53)21.动画关键帧示例 (55)(一).概述Silverlight是一个跨浏览器的、跨操作系统平台的插件,为Web带来下一代媒体体验和丰富的交互式应用程序体验. 使用JS实现Ajax技术可以使网站具有很好的用户体验, 但它也会使网站过于庞大和臃肿. 业余时间学习了一下微软的Silverlight官方教程, 在学习时顺便根据学习示例整理了一个教程. 此教程包括一些精简的小例子, 主要针对开发使用场景展开示例, 在实际开发中也可以作为查找手册使用. 运行环境为VS 2005, 这些示例比较简单很容易看懂, 因此示例没有太多注释.(二). 代码示例1).基础知识示例1. 对象的定位通过呈现几个Silverlight元素来示例对象之间的定位, 以及在一个页面中创建装载多个Silverlight对象.2. 使用SilverLight插件3. SilverLight元素的鼠标事件I.鼠标滑入和滑出事件II.鼠标点击(按下/弹起)和移动事件4. SilverLight元素的键盘事件5.方法createFromXaml使用示例6.访问和修改Silverlight元素以及属性7. Silverlight中的字体使用8.全屏支持功能9. Silverlight Downloader 对象使用10.定时器功能11.错误处理支持12.把xaml段内置在aspx或html页面中这样的话就不用单独的 *.xaml 文件来承载SilverLight对象控件元素内容.2).制作图形示例13.基本图形形状示例14.画刷对象的使用15.视频刷对象的使用16.Path元素使用17.变换效果(Transform)3).多媒体功能18.在线电影播放。
在Silverlight应用中,我们可能会遇到一些操作(如:下载某个资源或某些数据库事务或完成某些特定动作),这些操作耗时较长,容易造成“用户界面停止响应”的现象。
如果您需要能进行响应的用户界面,而且必须执行耗时操作,则可以使用BackgroundWorker 类方便地解决问题。
BackgroundWorker 类是.net 2.0里新增的一个类。
使用BackgroundWorker 类,我们可以在Silverlight 用户界面中指示操作进度、完成和取消情况。
例如,可以查看后台操作是已完成还是已取消并为用户显示消息。
一、BackgroundWorker类的基本了解涉及的命名空间using ponentModel;它的几个属性:CancellationPending——指示应用程序是否已请求取消后台操作。
IsBusy——指示 BackgroundWorker 是否正在运行异步操作WorkerReportsProgress——该值指示 BackgroundWorker 能否报告进度更新WorkerSupportsCancellation——该值指示 BackgroundWorker 是否支持异步取消它的主要事件:DoWork——调用 RunWorkerAsync 时发生。
注意确保在 DoWork 事件处理程序中不操作任何用户界面对象。
而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。
ProgressChanged——调用 ReportProgress 时发生。
RunWorkerCompleted——当后台操作已完成、被取消或引发异常时发生。
它的有关方法:CancelAsync——请求取消挂起的后台操作ReportProgress——引发 ProgressChanged 事件RunWorkerAsync——开始执行后台操作二、示例下面,我们就使用这个类来完成一个特定操作:用于执行从1累加到6.在累加过程中,SUM值会不断更新,当累加到6后,BackgroundWorker会在成功执行结束后调用一段程序来输出最终的运行信息。
新建一个名为:SLBackgroundWorker的Silverlight应用程序,如图:1、创建用户界面:Page.xaml代码如下:<UserControl x:Class="SLBackgroundWorker.Page"xmlns="/winfx/2006/xaml/presentation "xmlns:x="/winfx/2006/xaml"Width="400" Height="350"><Grid x:Name="LayoutRoot" Background="White"><StackPanel Orientation="Vertical" Width="400" Height="350" B ackground="Yellow" ><TextBlock x:Name="txtDisplay" FontSize="24" TextAlignmen t="Center" Margin="10" Text="当前无内容" Height="100" /><Button x:Name="btnRun" Content="从1到6累加" Click="OnRu n" Margin="10" Height="50"/><Button x:Name="btnCancel" Content="取消" Click="OnCance l" Margin="10" Height="50"/><TextBlock x:Name="txtUserState" FontSize="12" TextAlignm ent="Center" Text="显示ReportProgress方法传回的userState值 "/><TextBlock x:Name="txtEdoArgs" FontSize="12" TextAlignmen t="Center" Text="显示RunWorkerAsync()方法调用时传入的参数"/></StackPanel></Grid></UserControl>效果如下图2、使用BackgroundWorker类在此我们分四个步骤来操作2.1、声明一个BackgroundWorker类实例:若要在后台运行操作,请创建一个BackgroundWorker。
可以侦听报告操作进度并在操作完成时发出信号的事件。
worker =new ponentModel.BackgroundWorker();2.2、相关事件的定义若要设置后台操作,请为DoWork 事件添加事件处理程序,在此事件处理程序中调用耗时的操作。
#region当前BackgroundWorker所执行操作private void OnDoWork(object sender,DoWorkEventArgs e){//DoWorkEventArgs.Argument - RunWorkerAsync(object argu ment)传递过来的参数//DoWorkEventArgs.Cancel - 取消操作//DoWorkEventArgs.Result - 操作的结果。
将传递到 RunWorkerCo mpleted 所指定的方法//BackgroundWorker.ReportProgress(int percentProgress, object userState) - 向 ProgressChanged 汇报操作的完成进度// int percentProgress - 操作完成的百分比 1% - 100%// object userState - 传递到 ProgressChanged 的参数//获取在 worker.RunWorkerAsync()方法中传来的参数//在此处,我们把它赋值给了一个全局变量,并在OnProgressChanged过程中显示出来eStrAll = e.Argument.ToString();int Value = 0;//如果Value还没有加到6,并且应用程序还没有请求取消后台操作,则继续本循环while (Value <= 6 && !worker.CancellationPending){Thread.Sleep(1000); //挂起1秒钟Value++;#region调用方法一:不传递UserState值worker.ReportProgress(Value);#endregion#region调用方法一:要传递UserState值// worker.ReportProgress(Value, "传来的UserState值 " + Value.ToString()); //此处还可以传递userState(状态对象)到RunWorker Async,并在OnProgressChanged中获取#endregion}//如果应用程序请求取消后台操作,则取消if (worker.CancellationPending){e.Cancel = true;}#region可以在此处设置e.Result的值,并在OnWorkCompleted事件中获取它的值e.Result = "操作已完成";#endregion}#endregion若要收到进度更新的通知,请处理ProgressChanged 事件。
#region异步操作进度事件private void OnProgressChanged(object sender, ProgressChanged EventArgs e){// ProgressChangedEventArgs.ProgressPercentage - ReportPr ogress 传递过来的操作完成的百分比// erState - ReportProgress 传递过来的参数txtDisplay.Text = e.ProgressPercentage.ToString(); //显示当前进度#region如果在OnDoWork中使用的是调用方法二,则在此可获取erS tate值//在此处获取从OnDoWork中的 worker.ReportProgress方法传回的us erState值//txtUserState.Text = erState.ToString();#endregion#region显示RunWorkerAsync()方法调用时传入的参数this.txtEdoArgs.Text = eStrAll;#endregion}#endregion若要在操作完成时收到通知,请处理RunWorkerCompleted 事件。
#region操作成功完成时的处理事件private void OnWorkCompleted(object sender, RunWorkerComple tedEventArgs e){//RunWorkerCompletedEventArgs.Error - DoWork 时产生的错误 //RunWorkerCompletedEventArgs.Cancelled - 后台操作是否已被取消//RunWorkerCompletedEventArgs.Result - DoWork 的结果#region进行完成时的相关判断与处理if (e.Error !=null){txtDisplay.Text = "调用失败";}else{if(e.Cancelled){txtDisplay.Text = "已经取消本次操作!";}else{txtDisplay.Text = e.Result.ToString();// 可以在此处获取e.Result的值(它的值在OnDoWork中进行了设置)}}#endregion}#endregion若要取消异步操作,则使用CancelAsync方法。