【发布时间】:2011-01-09 06:58:25
【问题描述】:
我正在尝试使用以下 F# 代码来访问 Xaml 控件。
let (?) (source:obj) (s:string) =
match source with
| :? ResourceDictionary as r -> r.[s] :?> 'T
| :? Control as source ->
match source.FindName(s) with
| null -> invalidOp (sprintf "dynamic lookup of Xaml component %s failed" s)
| :? 'T as x -> x
| _ -> invalidOp (sprintf "dynamic lookup of Xaml component %s failed because the component found was of type %A instead of type %A" s (s.GetType()) typeof<'T>)
| _ -> invalidOp (sprintf "dynamic lookup of Xaml component %s failed because the source object was of type %A. It must be a control or a resource dictionary" s (source.GetType()))
这是来自 Daniel Mohl 的优秀 F# for Windows Phone 模板。
我创建了一个类来读取加速度计并在手机摇晃时触发事件。该事件按预期引发,但由于某种原因,它在第二个线程中产生 - 当事件处理程序尝试执行此代码时,这会导致 CLR 引发“无效的跨线程访问”异常。在source.FindName(s) 调用上引发异常。我可以看到第二个执行线程——这让我感到惊讶,因为我没有专门产生一个辅助线程。我的意思是我没有明确调用 async 或做任何我能想到的会导致辅助执行线程启动的事情。
看来我可以采取一些方法:
- 我可以试着弄清楚我为什么 当我产生一个辅助线程 没有专门要求它并修改代码以防止第二个线程 执行。
- 我可以尝试修改 (?) 功能考虑多个 执行线程,但我真的 想了解为什么我得到一个 第二个线程开始
我认为第二种方法可能是最好的,但我真的很想了解我正在做什么导致辅助线程产生。我意识到在没有特定代码的情况下很难回答,但如果有人能指出我正确的方向,我不介意研究这个。我相信这与 Windows 7 Phone 平台有关,因为据我所知,代码几乎是将 Xaml 控件与 F# 代码绑定的惯用方式。
任何想法、cmets、建议将不胜感激。
也交叉发布到HubFS
【问题讨论】:
标签: f# windows-phone-7