F# 调度程序调用和委托方法

6

我长时间寻找解决这个问题的方法,但没有成功。

我正在将我的一些C#代码移植到F#,并且我在处理WPF元素的Dispatcher.Invoke时遇到了困难。由于我在F#方面是一个完全的新手,唯一确定的事情就是问题出现在键盘和椅子之间。

以下是我的C#代码:

foreach (var k  in ChartList.Keys)            
        {
            ChartList[k].Dispatcher.Invoke(
              System.Windows.Threading.DispatcherPriority.Normal,
              new Action(
                delegate()
                {
                    ChartList[k].Width = area.Width / totalColsForm;
                    ChartList[k].Height = area.Height / totalRowsForm;
                    ChartList[k].Left = area.X + ChartList[k].Width * currentCol;
                    ChartList[k].Top = area.Y + ChartList[k].Height * currentRow;
                    ChartList[k].doShow();
                }
            ));
         }

我遇到困难的部分是新的Action(delegate() ... )。编译器不喜欢我任何尝试翻译它。

这段代码在 F# 中的翻译是什么?


你尝试了什么?我期望 fun () -> ...Action(fun () -> ...) 能够工作。 - Daniel
@Daniel,确切地说,我都尝试过了但没有成功。我得到了错误信息“没有匹配方法'Invoke'的重载项”=> 这是委托方法的翻译存在问题。 - Anass
1个回答

6

Invoke方法有几个重载,因此如果您在操作中存在一些不正确的内容,则可能会出现一些奇怪的错误,因为类型检查器不知道调用哪个重载。我刚刚尝试了这个方法,它可以正常工作:

open System
open System.Windows.Controls
open System.Windows.Threading

let b = Button()
b.Dispatcher.Invoke(
    DispatcherPriority.Normal,
    Action(fun () -> 
        b.Content <- "foo"
    )) |> ignore

谢谢Gustavo,我尝试了你的代码,但我仍然遇到了之前的错误,即“无效使用接口类型”,而Action一词被下划线标记。我想出了自己的解决方案。我明确声明了 type my_delegate = delegate of unit -> unit我的代码变成了 for k in ChartList.Keys do ChartList.[k].Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new my_delegate(fun () -> ChartList.[k].doShow() )) |> ignore代码编译成功,但我仍然不明白为什么使用Action会引发错误。 - Anass
你是否有名为Action的接口?请尝试拼写System.Action。 - Gustavo Guerra
成功了!!谢谢Gustavo,但我不明白,我已经有所有必要的引用和所需的开放语句。很奇怪! - Anass
1
尝试将Action放回去并悬停在其上,以查看类型的完整名称。可能您的项目中还有其他名为Action的内容,可能是您使用的图表库的某个组件,并且您刚好在打开System之后打开了它。 - Gustavo Guerra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接