F# 异步显示 WPF 窗口

2023-12-04

这个问题一直让我抓狂。总体要点如下:

我的解决方案中有两个项目:第一个是 F# 控制台应用程序,第二个是 C# 库,其中包含名为的 C#+XAML 类DisplayWindow继承自 WPF 窗口。DisplayWindow有一个方法public void SetMessage(string s) {...}这使得窗口以大而闪亮的字母显示传递给它的文本,这些字母可能还会闪烁和旋转,并执行 WPF 擅长的其他所有操作。

问题是:我需要从我的 F# 程序中创建一个函数let openAWindow text = ???以便它将打开一个新的DisplayWindow每次与文本一起调用时都是异步的。做这个的最好方式是什么?使用async {} or System.Threading.Thread?谢谢您的帮助 :)

编辑:我找到了这篇博文http://deanchalk.com/2010/10/08/f-interacting-with-wpf-dispatcher-via-f-interactive-window/可以工作,但有时(?)会导致 ArgumentException 并显示错误文本“具有相同键的条目已存在。”所以我不知道那里发生了什么:(


我这样做是为了我们的F# 用于可视化图书馆,然后描述了我在书中使用的技术用于技术计算的 Visual F# 2010.

首先,我编写了一个惰性 thunk 来初始化 WPF(包括 STA UI 线程和Application) 当强制求值时:

> let ui =
    let mk() =
      let wh = new ManualResetEvent(false)
      let application = ref null
      let start() =
        let app = Application()
        application := app
        ignore(wh.Set())
        app.Run() |> ignore
    let thread = Thread start
    thread.IsBackground <- true
    thread.SetApartmentState ApartmentState.STA
    thread.Start()
    ignore(wh.WaitOne())
    !application, thread
  lazy(mk());;
val ui : Lazy<Application * Thread> = <unevaluated>

然后我写了一个spawn调度函数应用程序的函数f争论x这样它就在 UI 线程上运行:

> let spawn : ('a -> 'b) -> 'a -> 'b =
    fun f x ->
      let app, thread = ui.Force()
      let f _ =
        try
          let f_x = f x
          fun () -> f_x
        with e ->
          fun () -> raise e
      let t = app.Dispatcher.Invoke(DispatcherPriority.Send, System.Func<_, _>(f), null)
      (t :?> unit -> 'b)();;
val spawn : ('a -> 'b) -> 'a -> 'b

现在只需调用您的openAWindowUI 线程上的函数:

let openAWindow text =
  DisplayWindow().SetMessage text

spawn openAWindow text
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

F# 异步显示 WPF 窗口 的相关文章

随机推荐

  • 为什么第 n 个子选择器不起作用?

    我正在使用nth child选择器为不同的社交图标添加背景图像 然而 所有图标看起来都是一样的 我究竟做错了什么 social logo display inline block width 24px height 24px transit
  • jQuery 中的鼠标滚轮问题

    我在头部有以下代码 jQuery function box bind mousewheel function event delta var dir delta gt 0 Up Down vel Math abs delta alert d
  • 调整图像内容大小但保持图像尺寸

    我正在尝试使用 PyGame 在 Python 中制作一个基本的 Pokemon 副本 我过去遵循过一些有关该库的教程 因此 对于这个项目 我将有一个基本的瓦片结构 要么是草 要么是水 玩家不能在水方块上移动 但可以在草方块上自由移动 我通
  • AspNetCompiler MSBuild 任务中的虚拟路径 - 它是否必须等于最终部署的虚拟路径?

    这是 VS 2008 和 Net 3 5 我使用自定义部署项目脚本 该脚本类似于发布右键单击菜单 但我已对其进行了自定义以执行文件重命名和各种其他零碎操作 它工作得非常好 并且大大简化了发布程序 本周末我发现我们的一个实时网站存在一个问题
  • 在 AJAX 之前我需要学习 Javascript 还是 AJAX 不需要 Javascript 知识? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我想知道是否值得先学习javascript AJAX 是否需要 JavaScript 或者只是标记语言的相似之处 你绝对应该学习 javascript 而且因为AJAX是用javascri
  • 不使用 Composer 安装 PHPMailer

    请原谅我的无知 我正在尝试在 Linux 上的 PHP 5 6 下安装 PHPMailer 6 0 1 我的 PHP 安装是远程的 我通过 FTP 管理所有网站的 PHP 我通常将软件包作为 zip 下载到 Win 10 解压 然后将结果通
  • 将无头浏览器与 Heroku Rails Unicorn 堆栈结合使用

    我看到过一些帖子 您可以更改 Heroku 上的构建 以将 PhantomJS 与 Cedar 堆栈一起使用 但是是否可以在 unicorn 堆栈上运行无头浏览器 是的 有人已经编写了一个包含 PhantomJS 的构建包 互联网和开源非常
  • 使用 Linq 遍历层次结构表

    我有一个包含两列的表 GroupId 和 ParentId 均为 GUIDS 该表形成了一个层次结构 因此我可以在 GroupId 字段中查找值 当我找到它时 我可以查看它的 ParentId 这个ParentId也会出现在不同记录的Gro
  • Jquery 中的去抖动功能?

    一直在寻找 Jquery 中的去抖函数或去抖方法 动画的构建可能会变得非常烦人 代码如下 function fade media hide media fadeIn 2000 var debounce false function colo
  • 预先已知字符串的完美哈希函数

    我有 4000 个字符串 我想用这些字符串创建一个完美的哈希表 字符串是预先知道的 所以我的第一个想法是使用一系列if声明 if name aaa return 1 else if name bbb return 2 4000th if s
  • 使用 C# 以编程方式更改 ipsec 规则的方法?

    我知道如何执行 IPsec 更改的唯一方法是调用 netsh 来进行更改 有没有直接使用 System Management 和 WMI 对象的方法 如果是这样 那是什么 我很难通过 MSDN 找到相关的 WMI 信息 或者有人使用过其他有
  • 是否可以从另一个文件调用测试函数来开始测试

    是否可以从非测试 go 文件中调用测试函数来开始执行测试 例如 我有一个测试功能 package API import testing func TestAPI t testing T 我需要从非测试 go 文件中调用它 package m
  • 在 Three.js 中渲染具有输入顶点的多边形

    我有多边形的顶点 x y z 坐标 作为输入 如何在 Three js 中渲染具有这些顶点的多边形 有this但似乎涉及到贝塞尔曲线 我需要简单的直边多边形 您可以使用以下代码从顶点创建多边形 var geom new THREE Geom
  • 测试 Postgres 表分区的 HASH 函数

    我正在使用 Postgres 11 并且想在主键是 UUID 的表上使用哈希分区 我知道我需要预先选择多个分区 并且主键上的哈希函数的模数将用于将行分配给每个分区 像这样的事情 CREATE TABLE new table id uuid
  • Webpack FOSJsRoutingBundle 与 Symfony Flex 和 Angular 集成

    我不明白FOSJs路由包跟 共事Symfony Flex Webpack and AngularJS 我已经在 Symfony 3 和 AngularJS 中使用这个包很长时间了 从来没有出现过问题 但随着 Symfony Flex 中引入
  • System.Runtime.InteropServices.COMException:检索 CLSID 为 {58968145-CF05-4341-995F-2EE093F6ABA3} 的组件的 COM 类工厂失败

    我正在运行一个 C 应用程序 并且正在使用 DSOFile dll 项目中引用了该DLL 我可以在我的开发机器上运行该exe 但是当我在另一台机器上运行 exe 时 我得到了 未处理的异常 System Runtime InteropSer
  • 有没有办法改变包装时物品的顺序?

    我正在尝试创建一个网站的一部分 由 3 个部分组成 我们称它们为 A B C 其中 A 和 B 彼此相邻 对齐以接触容器的相对两侧 它们下面是 C 但是当 A 和 B 在容器中无法并排放置时 B 会包裹在 C 下方 而不是包裹在 A 和 C
  • 错误:“}”中出现意外的“}”[重复]

    这个问题在这里已经有答案了 我有以下代码 TB lt data frame 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 TB BIG value lt apply TB 1 function r sr lt so
  • 偶数斐波那契数之和 < X

    我正在研究这个 我似乎有一个可行的解决方案 但我很难理解它的行为 这是我所拥有的 usr bin python def even fib sums limit number 1 last 0 before last 0 total 0 fo
  • F# 异步显示 WPF 窗口

    这个问题一直让我抓狂 总体要点如下 我的解决方案中有两个项目 第一个是 F 控制台应用程序 第二个是 C 库 其中包含名为的 C XAML 类DisplayWindow继承自 WPF 窗口 DisplayWindow有一个方法public