【问题标题】:Thread-Safe Accesses To Windows Form Controls From F#从 F# 对 Windows 窗体控件的线程安全访问
【发布时间】: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 或做任何我能想到的会导致辅助执行线程启动的事情。

看来我可以采取一些方法:

  1. 我可以试着弄清楚我为什么 当我产生一个辅助线程 没有专门要求它并修改代码以防止第二个线程 执行。
  2. 我可以尝试修改 (?) 功能考虑多个 执行线程,但我真的 想了解为什么我得到一个 第二个线程开始

我认为第二种方法可能是最好的,但我真的很想了解我正在做什么导致辅助线程产生。我意识到在没有特定代码的情况下很难回答,但如果有人能指出我正确的方向,我不介意研究这个。我相信这与 Windows 7 Phone 平台有关,因为据我所知,代码几乎是将 Xaml 控件与 F# 代码绑定的惯用方式。

任何想法、cmets、建议将不胜感激。

也交叉发布到HubFS

【问题讨论】:

    标签: f# windows-phone-7


    【解决方案1】:

    WP7 中的事件处理通常在异步回调上处理。访问加速度计也不例外。

    您需要将导致 UI 更新的任何代码定向到调度程序。

    在 c# 中可以这样做

    Dispatcher.BeginInvoke( () => { /* your UI code */ } );
    

    本文中使用的将结果发送到 Dispatcher 的方法在 f# 中也可能对您有所帮助,因为使用 Rx,它更像是一种函数式风格而不是命令式风格。

    WP7 Code: Using the Accelerometer API - Dragos Manolescu's (work) blog

    【讨论】:

    • 谢谢米克——链接看起来很有希望,我正在查看 BeginInvoke 的东西,但不太明白。
    • 我写的这篇文章让您简单了解为什么/何时使用调度程序。 social.msdn.microsoft.com/Forums/en-US/windowsphone7series/…
    • 再次感谢 Mick——Dispatcher.BeginInvoke 正是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多