Silverlight多线程与网络编程全解析
立即解锁
发布时间: 2025-08-13 03:16:12 阅读量: 20 订阅数: 36 

# Silverlight 多线程与网络编程全解析
## 1. 多线程编程要点
在 Silverlight 应用程序中引入多线程有多种方式,不过在深入多线程编程之前,需要谨慎考虑。由于深度多线程代码本身的复杂性,特别是在不同操作系统和硬件环境下,建议谨慎使用多线程。
### 1.1 多线程使用建议
- **优先使用 BackgroundWorker 组件**:它能让你启动搜索并提前结束操作,比使用底层的 Thread 类更简单直接。
- **控制线程数量**:若需要使用 Thread 类,尽量只使用一两个后台线程。
- **避免线程同步问题**:让线程处理不同的信息块,避免锁定和同步带来的麻烦。
### 1.2 示例代码片段
```vb
For Each prime As Integer In primes
lstPrimes.Items.Add(prime)
Next
End If
cmdFind.IsEnabled = True
cmdCancel.IsEnabled = False
progressBar.Value = 0
End Sub
```
## 2. 网络编程基础
Silverlight 应用程序需要与外界交互以获取相关的最新信息。除了使用 WCF 服务,还可以从其他非 .NET 资源(如 REST 服务、RSS 源和普通 HTML 网页)中获取数据。
### 2.1 网络交互类
- **WebClient 类**:可用于从网络下载文件,不仅能下载二进制文件,还能访问 HTML 页面和 Web 服务。
- **WebRequest 类**:功能更强大,能向网页提交值。
### 2.2 安全限制
Silverlight 对使用 HTTP 的代码有安全限制,类似于 Ajax 中的 XMLHttpRequest 对象,WebClient 和 WebRequest 类也有跨域访问限制。
## 3. 跨域访问规则
### 3.1 跨域限制原因
为了安全考虑,防止钓鱼攻击。如果 Silverlight 应用程序能在不通知用户的情况下调用其他网站,可能会导致用户信息泄露。
### 3.2 跨域访问解决方案
- **XML 策略文件**:Silverlight 会查找 `clientaccesspolicy.xml` 或 `crossdomain.xml` 文件,这些文件需存储在网站根目录。例如,Flickr 的 `crossdomain.xml` 文件允许所有访问:
```xml
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>
```
而 Twitter 的 `clientaccesspolicy.xml` 文件只允许特定域名访问:
```xml
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="twitter.com" />
<allow-access-from domain="api.twitter.com" />
<allow-access-from domain="search.twitter.com" />
<allow-access-from domain="static.twitter.com" />
...
</cross-domain-policy>
```
- **服务器端代理**:若网站不允许跨域访问,可创建一个包含 Web 服务的 ASP.NET 网站作为代理。
### 3.3 跨域访问流程
```mermaid
graph LR
A[Silverlight 应用] -->|请求数据| B{检查跨域策略文件}
B -->|存在且允许| C[访问网站数据]
B -->|不存在或不允许| D[使用服务器端代理]
D -->|通过代理| C
```
## 4. HTML 数据抓取
### 4.1 HTML 抓取原理
通过 WebClient 类下载 HTML 文档,然后解析数据。对于较小的文本内容,可使用 `DownloadStringAsync()` 方法将结果作为单个字符串返回。
### 4.2 示例代码
```vb
Private Sub cmdGetData_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim client As New WebClient()
Dim address As New Uri("http://localhost:" & _
HtmlPage.Document.DocumentUri.Port & "/ASPWebSite/PopulationTable.html")
AddHandler client.DownloadStringCompleted, _
AddressOf client_DownloadStringCompleted
client.DownloadStringAsync(address)
End Sub
Private Sub client_DownloadStringCompleted(ByVal sender As Object, _
ByVal e As DownloadStringCompletedEventArgs)
Dim pageHtml As String = ""
Try
pageHtml = e.Result
Catch
lblResult.Text = "Error contacting service."
Return
End Try
...
```
### 4.3 正则表达式解析数据
使用正则表达式从 HTML 字符串中提取所需信息,可使用命名组来简化操作。示例中的命名组 `(?<p
0
0
复制全文
相关推荐










