在silverlight 2(Beta1) 中使用BackgroundWorker非常简单,下面是一个DEMO,用于执行从1
累加到100.在累加过程中,SUM值会不断更新,当累加到100后,BackgroundWorker会在成功执行
结束后调用一个 WCF服务来输出最终的运行信息,就像我们在下面这张图中看到的一样.
首先我们要创建一个WCF服务应用,用来返回指定的累加数据信息.相应名称为:
CrossSiteCall_Server
因为要用到跨站调用,所以我们还要建立一个clientaccesspolicy.xml文件,并放在该项目的根目
录下,其内容如下:
< access-policy >
< cross-domain-access >
< policy >
< allow-from >
< domain uri ="*" />
</ allow-from >
< grant-to >
< resource path ="/" include-subpaths ="true" />
</ grant-to >
</ policy >
</ cross-domain-access >
</ access-policy >
下面是相应的接口(Contract)及功能代码:
public interface IService
{
[OperationContract]
string ShowMessage( int x, int y, int sum);
}
public class Service : IService
{
public string ShowMessage( int x, int y , int sum)
{
return " 从 " + x + " 累加到 " + y + " 等于: " + sum;
}
}
然后将web.config文件中的binding="wsHttpBinding" 改写成basicHttpBinding. 编译运行这个
项目,并将最终的服务引用地址复制下来.
本DEMO中的链接地址:http://localhost:7501/Service.svc
然后我们再去创建一个Silverlight Application 项目,并将其命名为:BackgroundWorker
并在当前的silverlight项目中添加上面SVC地址的服务引用,并将其命名为Service.
下面就是相应的xaml代码,将它放入Page.xaml中:
< StackPanel HorizontalAlignment ="Center" VerticalAlignment ="Center" >
< TextBlock x:Name ="txtDisplay" FontSize ="24" TextAlignment ="Center" Margin ="10" Text ="暂无内容" />
< Button x:Name ="btnRun" Content ="从1到100累加" Click ="OnRun" Margin ="10" />
< Button x:Name ="btnCancel" Content ="取 消" Click ="OnCancel" Margin ="10" />
</ StackPanel >
</ Grid >
接下来就是相应的cs代码了,相当的注释我已写入代码段中,相信大家看一下就会明白了:)
{
private System.ComponentModel.BackgroundWorker worker;
private int sum = 0 ; // 累加数
private int cur_number = 1 ; // 当前数值
void OnRun( object sender, EventArgs args)
{
worker = new System.ComponentModel.BackgroundWorker();
// 当前BackgroundWorker所执行的操作
worker.DoWork += OnDoWork;
// 绑定异步操作进度的事件
worker.ProgressChanged += OnProgressChanged;
// 绑定操作成功完成的处理事件
worker.RunWorkerCompleted += OnWorkCompleted;
// 是否报告进度更新
worker.WorkerReportsProgress = true ;
// 是否支持异步取消
worker.WorkerSupportsCancellation = true ;
// 开始执行后台操作
worker.RunWorkerAsync();
}
void OnWorkCompleted( object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null )
{
Exception ex = e.Error; // int x = 10;
}
if (e.Cancelled)
{
txtDisplay.Text = " 取消! " ;
}
else
{
txtDisplay.Text += " 完毕, 开始调用WCF! " ;
// 调用Service服务
ServiceClient proxy = new ServiceClient();
proxy.ShowMessageCompleted += OnShowMessageCompleted;
proxy.ShowMessageAsync( 1 , 100 , sum);
}
}
void OnProgressChanged( object sender, ProgressChangedEventArgs e)
{
txtDisplay.Text = e.ProgressPercentage.ToString();
}
void OnDoWork( object sender, DoWorkEventArgs e)
{
// throw new ApplicationException("Foo");
while (cur_number <= 100 && ! worker.CancellationPending)
{
Thread.Sleep( 100 );
sum += cur_number;
cur_number ++ ;
worker.ReportProgress(sum);
}
if (worker.CancellationPending)
{
e.Cancel = true ;
}
}
void OnShowMessageCompleted( object sender, ShowMessageCompletedEventArgs e)
{
if (e.Error != null )
{
txtDisplay.Text = " 调用失败 " ;
}
else
{
txtDisplay.Text = e.Result.ToString();
}
}
void OnCancel( object sender, EventArgs args)
{
sum = 0 ;
cur_number = 0 ;
// 取消异步操作
worker.CancelAsync();
}
}
另外还需要在cs文件中引用一下相应的名空间如下:
using System.Threading;
using BackgroundWorker.Service; // wcf引用名空间
现在就可以编译运行这个silverlight应用的(之前请先运行上面的wcf项目).
另外除了BackgroundWorker, silverlight 2目前还可以使用DispatcherTimer组件定时器来
进行一些需要定时运行的任务.详见这里:)
看来SL真是越来越强大了.
源码下载,请点击这里:)