Silverlight多线程与网络交互技术全解析
立即解锁
发布时间: 2025-08-26 01:21:58 阅读量: 2 订阅数: 17 


Silverlight开发实战精要
### Silverlight 多线程与网络交互技术全解析
#### 1. 多线程中的进度跟踪
在处理长时间运行的任务时,让客户端了解任务的完成进度是很有必要的。`BackgroundWorker` 提供了内置的进度跟踪支持。
- **设置进度跟踪支持**:首先要将 `BackgroundWorker.WorkerReportsProgress` 属性设置为 `True`。
- **报告进度**:在 `DoWork` 事件处理代码中调用 `BackgroundWorker.ReportProgress()` 方法,并提供一个估计的完成百分比(从 0% 到 100%)。例如,`FindPrimes()` 方法以 1% 的增量报告进度,代码如下:
```vb
Dim iteration As Integer = list.Length / 100
For i As Integer = 0 To list.Length - 1
...
' 仅当进度变化为 1% 时报告进度
' 此外,如果没有 BackgroundWorker 或它不支持进度通知,则不进行计算
If (i Mod iteration = 0) AndAlso (backgroundWorker IsNot Nothing) Then
If backgroundWorker.WorkerReportsProgress Then
backgroundWorker.ReportProgress(i \ iteration)
End If
End If
Next
```
- **显示进度信息**:Silverlight 没有内置的进度条控件,你可以使用常见的 Silverlight 元素构建一个基本的进度条。以下是一个使用两个矩形(一个用于背景,一个用于进度条)和一个 `TextBlock` 显示百分比的示例:
```xml
<Rectangle x:Name="progressBarBackground" Fill="AliceBlue" Stroke="SlateBlue"
Grid.Row="4" Grid.ColumnSpan="2" Margin="5" Height="30" />
<Rectangle x:Name="progressBar" Width="0" HorizontalAlignment="Left"
Grid.Row="4" Grid.ColumnSpan="2" Margin="5" Fill="SlateBlue" Height="30" />
<TextBlock x:Name="lblProgress" HorizontalAlignment="Center" Foreground="White"
VerticalAlignment="Center" Grid.Row="4" Grid.ColumnSpan="2" />
```
为了确保进度条在用户调整浏览器窗口大小时仍能正常显示,需要处理 `SizeChanged` 事件:
```vb
Private maxWidth As Double
Private Sub UserControl_SizeChanged(ByVal sender As Object, ByVal e As SizeChangedEventArgs)
maxWidth = progressBarBackground.ActualWidth
End Sub
```
处理 `BackgroundWorker.ProgressChanged` 事件,调整进度条大小并显示当前进度百分比:
```vb
Private Sub backgroundWorker_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)
progressBar.Width = CDbl(e.ProgressPercentage)/100 * maxWidth
lblProgress.Text = (CDbl(e.ProgressPercentage)/100).ToString("P0")
End Sub
```
- **传递额外信息**:`ReportProgress()` 方法有一个重载版本,接受两个参数。第一个参数是完成百分比,第二个参数是用于传递额外信息的自定义对象。例如:
```vb
backgroundWorker.ReportProgress(i / iteration, i)
```
在 `ProgressChanged` 事件处理程序中检查并显示这些额外信息:
```vb
If e.UserState IsNot Nothing Then
lblStatus.Text = "Found prime: " & e.UserState.ToString() & "..."
End If
```
#### 2. 支持任务取消
使用 `BackgroundWorker` 添加对取消长时间运行任务的支持也很容易。
- **设置支持取消**:将 `BackgroundWorker.WorkerSupportsCancellation` 属性设置为 `True`。
- **请求取消**:调用 `BackgroundWorker.CancelAsync()` 方法。例如,当用户点击取消按钮时:
```vb
Private Sub cmdCancel_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
backgroundWorker.CancelAsync()
End Sub
```
- **检查取消请求**:在执行任务的代码中,需要显式检查取消请求,执行必要的清理并返回。例如,在 `FindPrimes()` 方法中:
```vb
For i As Integer = 0 To list.Length - 1
...
If (i Mod iteration) AndAlso (backgroundWorker IsNot Nothing) Then
If backgroundWorker.CancellationPending Then
' 不做更多工作,直接返回
Return
End If
If backgroundWorker.WorkerReportsProgress Then
backgroundWorker.ReportProgress(i / iteration)
End If
End If
Next
```
在 `DoWork` 事件处理程序中,还需要显式设置 `DoWorkEventArgs.Cancel` 属性为 `True` 来完成取消操作:
```vb
Private Sub backgroundWorker_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
Dim input As FindPrimesInput = CType(e.Argument, FindPrimesInput)
Dim primes As Integer() = Worker.FindPrimes(inpu
```
0
0
复制全文
相关推荐










