F#:将项添加到计时器上的字典中

时间:2016-07-20 16:19:05

标签: dictionary timer f#

我正在创建一个程序,它加载一个程序集文件(.dll)并在一个间隔内执行程序集文件中的方法,然后尝试将结果存储在字典中。完整代码是here(pastebin.com)。我的问题是,似乎在计时器上向字典添加内容会导致字典无法更新。我能够将重现此问题的相关代码减少到以下内容:

type SomeThing() as this =
    do
        let timer = new System.Timers.Timer()
        timer.Elapsed.Add(this.AddItem)
        timer.Interval <- 3000.0
        timer.Enabled <- true
        timer.Start()

    member this.MyDict = new System.Collections.Generic.Dictionary<string, string>()

    member this.AddItem _ =
        this.MyDict.Add("hello", "world")
        printfn "%A" this.MyDict

let mything = new SomeThing()

如果在交互式会话或LINQPad之类的内容中运行,结果是输出:

seq []
seq []
 .
 .
 .

显然字典没有改变。我还在Visual Studio调试器中确认字典没有更改。这几乎就像跳过了MyDict.Add一行。我假设这与我使用type / do语句有关,因为使用计时器和类型之外的字典似乎没有问题。

有人能指出我做错了吗?

1 个答案:

答案 0 :(得分:9)

问题在于:

member this.MyDict = new System.Collections.Generic.Dictionary<string, string>()

这是一个只读属性,其返回表达式为new System.Collections.Generic.Dictionary<string, string>()。即,每次读取属性时,都会返回一个新的不同字典。如果有帮助,这就是它在C#中的样子:

Dictionary<string, string> MyDict => new Dictionary<string, string>();

以下是您使用automatically implemented properties

的内容
member val MyDict = new System.Collections.Generic.Dictionary<string, string>() with get

等价C#:

Dictionary<string, string> MyDict { get; } = new Dictionary<string, string>();