Windows Phone 7 开发笔记:读取网络内容

刚买了 Windows Phone 7,自然要拿来练练手。好久没正经写过软件程序了,对于 .Net、Silverlight 还很陌生。摸爬滚打之后,总结一些通用的东西。

第一个练习程序很简单:读取网络内容,分析/提取有用的信息,然后显示出来。

读取网络内容

Silverlight 作为 .Net 的子集,依然是使用异步通讯法读取 HTTP 资源。也就是说,通过 HttpWebRequest.BeginGetResponse() 先发送非阻止请求(non-blocking),然后通过回调函数(Callback)来处理真正的返回内容。(具体例子可以参见:MSDN 资料

但是,MSDN 给出的例子却不能正常在 Windows Phone 7 上面运行。问题就出在“多线程”机制上。MSDN 的例子,在发送请求之后,通过调用 allDone.WaitOne() 等待回调函数触发 allDone 事件。但实际上因为 Windows Phone 7 的多线程机制,进程会卡死在等候 allDone 事件上。

另外,由于回调函数属于另外一个非用户界面线程(non-UI thread),所以任何跟 UI 有关的代码都不能直接出现在回调函数中,否则会出现“Invalid cross-thread access”异常。解决方法下面会提到。

分析/提取内容

不多说,正则表达式(Regular Expression)是不二的选择。只是要在规则(pattern)字符串前加一个 @,这样才能使用正则表达式的转义符(比如:\s、\w 等等)。MSDN 资料

显示内容

之前提到过,在非用户界面线程中直接调用跟用户界面有关的代码,哪怕是向 ListBox 中添加项,都会造成异常。这时候就需要 Dispatcher 参与。

// extract prices and show
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
    this.Items.Clear();
    foreach (Match m in priceRegex.Matches(fullHTML))
    {
        this.Items.Add(new ItemViewModel() { LineOne = m.Groups[1].Value, LineTwo = m.Groups[2].Value, LineThree = m.Groups[4].Value });
    }
});
已有 2 条评论
  1. jolen jolen

    我用了msdn上的"...通过HttpWebRequest.BeginGetResponse()发送异步请求.. allDone.WaitOne() ",果然是allDone.WaitOne()之后就卡死了,想请教一下有没什么方式解决?谢。

  2. snailium snailium

    @jolen
    删掉所有跟allDone相关的代码。

添加新评论