您的位置:首页 > 其它

如何:使用后台辅助线程

2012-08-24 22:09 288 查看
http://msdn.microsoft.com/zh-cn/library/cc221403(v=vs.95).aspx

如何:使用后台辅助线程

Silverlight

1(共 1)对本文的评价是有帮助
- 评价此主题

Silverlight BackgroundWorker 类提供通过后台线程运行非常耗时的操作的便利方法。BackgroundWorker
类允许您查看操作的状态并且可以取消操作。

使用 BackgroundWorker 类时,可以在 Silverlight 用户界面中指示操作进度、完成和取消情况。例如,可以查看后台操作是已完成还是已取消并为用户显示消息。

过程

使用 BackgroundWorker 类

在类级别创建 BackgroundWorker 类的实例。

C#
VB

复制

BackgroundWorker bw = new BackgroundWorker();


指定是否希望后台操作允许执行取消操作和报告进度。

C#
VB

复制

bw.WorkerSupportsCancellation = true;
bw.WorkerReportsProgress = true;


为后台辅助线程的 DoWork 事件创建事件处理程序。

DoWork 事件处理程序位于在后台线程运行非常耗时的操作的位置。应在
DoWorkEventArgs 对象的
Argument 属性中传递要传递给后台操作的任何值,而该属性将传递给事件处理程序。

若要将进度报告回调用进程,请调用 ReportProgress 方法并将介于 0 到 100 之间的完成百分比传递给它。调用
ReportProgress 方法将引发
ProgressChanged 事件,您将单独处理该事件。


说明:
如果后台辅助线程的 WorkerReportsProgress 属性未设置为
true 且调用了 ReportProgress 方法,将引发异常。

若要确定是否有取消后台操作的挂起的请求,请查看 BackgroundWorker 对象的
CancellationPending 属性。如果该属性为
true,则表示调用了 CancelAsync 方法。将
BackgroundWorker 对象的
Cancel 属性设置为
true 并停止操作。

若要将数据传递回调用进程,请设置要传递给事件处理程序的 DoWorkEventArgs 对象的
Result 属性。在操作结束引发
RunWorkerCompleted 事件时,可以读取此值。

C#
VB

复制

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;

for (int i = 1; (i <= 10); i++)
{
if ((worker.CancellationPending == true))
{
e.Cancel = true;
break;
}
else
{
// Perform a time consuming operation and report progress.
System.Threading.Thread.Sleep(500);
worker.ReportProgress((i * 10));
}
}
}


为后台辅助线程的 ProgressChanged 事件创建事件处理程序。

ProgressChanged 事件处理程序中,添加指示进度的代码(如更新用户界面)。

若要确定操作的完成百分比,请查看传递给事件处理程序的 ProgressChangedEventArgs 对象的
ProgressPercentage 属性。

C#
VB

复制

private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.tbProgress.Text = (e.ProgressPercentage.ToString() + "%");
}


RunWorkerCompleted 事件创建一个事件处理程序。

后台辅助线程完成时,将引发 RunWorkerCompleted 事件。根据后台操作是成功完成、遇到错误还是已取消,相应更新用户界面。

若要确定是否出错,请查看传递给事件处理程序的 RunWorkerCompletedEventArgs 对象的
Error 属性。如果出错,此属性将包含异常信息。

如果后台操作允许取消且您想查看操作是否被取消,请查看传递给事件处理程序的 RunWorkerCompletedEventArgs 对象的
Cancelled 属性。如果该属性为
true,则表示调用了 CancelAsync 方法。

C#
VB

复制

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if ((e.Cancelled == true))
{
this.tbProgress.Text = "Canceled!";
}

else if (!(e.Error == null))
{
this.tbProgress.Text = ("Error: " + e.Error.Message);
}

else
{
this.tbProgress.Text = "Done!";
}
}


BackgroundWorker 实例的事件添加事件处理程序。

下面的示例演示如何为 DoWorkProgressChanged
RunWorkerCompleted 事件添加事件处理程序。

C#
VB

复制

bw.DoWork +=
new DoWorkEventHandler(bw_DoWork);
bw.ProgressChanged +=
new ProgressChangedEventHandler(bw_ProgressChanged);
bw.RunWorkerCompleted +=
new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);


通过调用 RunWorkerAsync 方法来开始运行后台操作。

C#
VB

复制

private void buttonStart_Click(object sender, RoutedEventArgs e)
{
if (bw.IsBusy != true)
{
bw.RunWorkerAsync();
}
}


通过调用 CancelAsync 方法来取消后台操作。

C#
VB

复制

private void buttonCancel_Click(object sender, RoutedEventArgs e)
{
if (bw.WorkerSupportsCancellation == true)
{
bw.CancelAsync();
}
}


示例

下面的示例演示如何使用 BackgroundWorker 类。在此示例中,后台操作运行
Sleep 方法并将进度报告给用户界面。后台辅助线程已配置为允许取消。

C#
VB

复制

using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

namespace SL_BackgroundWorker_CS
{
public partial class Page : UserControl
{
private BackgroundWorker bw = new BackgroundWorker();
public Page()
{
InitializeComponent();

bw.WorkerReportsProgress = true;
bw.WorkerSupportsCancellation = true;
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
}
private void buttonStart_Click(object sender, RoutedEventArgs e)
{
if (bw.IsBusy != true)
{
bw.RunWorkerAsync();
}
}
private void buttonCancel_Click(object sender, RoutedEventArgs e)
{
if (bw.WorkerSupportsCancellation == true)
{
bw.CancelAsync();
}
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;

for (int i = 1; (i <= 10); i++)
{
if ((worker.CancellationPending == true))
{
e.Cancel = true;
break;
}
else
{
// Perform a time consuming operation and report progress.
System.Threading.Thread.Sleep(500);
worker.ReportProgress((i * 10));
}
}
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if ((e.Cancelled == true))
{
this.tbProgress.Text = "Canceled!";
}

else if (!(e.Error == null))
{
this.tbProgress.Text = ("Error: " + e.Error.Message);
}

else
{
this.tbProgress.Text = "Done!";
}
}
private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.tbProgress.Text = (e.ProgressPercentage.ToString() + "%");
}
}
}



XAML

复制

<UserControl x:Class="SL_BackgroundWorker_CS.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<StackPanel Height="30" Orientation="Horizontal"
HorizontalAlignment="Left" VerticalAlignment="Top"
Margin="10" >
<Button x:Name="buttonStart" Content="Start" Click="buttonStart_Click"
Width="80" Height="30"/>
<Button x:Name="buttonCancel" Content="Cancel" Click="buttonCancel_Click"
Width="80" Height="30"/>
</StackPanel>
<StackPanel Margin="10,50,0,0" Orientation="Horizontal">
<TextBlock Text="Progress: "/>
<TextBlock x:Name="tbProgress"/>
</StackPanel>
</Grid>
</UserControl>


XAML

复制

<UserControl x:Class="SL_BackgroundWorker_VB.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<StackPanel Height="30" Orientation="Horizontal"
HorizontalAlignment="Left" VerticalAlignment="Top"
Margin="10" >
<Button x:Name="buttonStart" Content="Start" Click="buttonStart_Click"
Width="80" Height="30"/>
<Button x:Name="buttonCancel" Content="Cancel" Click="buttonCancel_Click"
Width="80" Height="30"/>
</StackPanel>
<StackPanel Margin="10,50,0,0" Orientation="Horizontal">
<TextBlock Text="Progress: " />
<TextBlock x:Name="tbProgress" />
</StackPanel>
</Grid>
</UserControl>


请参见

参考

BackgroundWorker

其他资源

托管线程处理

本文是否对您有所帮助?
是否

不准确
深度不够
需要更多代码示例
翻译需要改进

请告诉我们更多意见...
(1500 个剩余字符)

社区内容添加


常见问题

© 2012 Microsoft. 版权所有。

保留所有权利 |
商标 |
隐私权声明|
个人信息中心 |
法律信息 |
MSDN Flash 中心 |
联系我们|
网站反馈 网站反馈



网站反馈
x

请与我们分享您的经历…
页面加载速度够快吗?
是 否
您喜欢网页的设计吗?
是 否
请告诉我们更多意见
Enter description here.

<div><img alt="DCSIMG" id="Img1" width="1" height="1" src="http://m.webtrends.com/dcsmgru7m99k7mqmgrhudo0k8_8c6m/njs.gif?dcsuri=/nojavascript&WT.js=No" /></div>
<a href="http://www.omniture.com" title="Web Analytics"> <img src="//msstonojsmsdn.112.2o7.net/b/ss/msstonojsmsdn/1/H.20.2--NS/0" height="1" width="1" border="0" alt="" /></a>

loading...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: