2016-07-20 8 views
6

アセンブリファイル(.dll)を読み込み、ある間隔でアセンブリファイル内のメソッドを実行し、その結果を辞書に格納しようとするプログラムを作成しています。その完全なコードはhere(pastebin.com)です。私の問題は、タイマーの辞書に物を追加すると辞書が更新できなくなっているようだということです。私は次のようにこの問題を再現関連するコードを削減することができました:F#:タイマーで辞書に項目を追加する

seq [] 
seq [] 
. 
. 
. 

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のようなもので実行した場合、出力されます明らかに、辞書は変更されていません。また、Visual Studioのデバッガで辞書が変更されていないことを確認しました。 MyDict.Add行がスキップされているかのようです。私はこれはタイマーと型の外の辞書を使用して問題がないように見えるので、私は型/ do文の私の使用と関係があると仮定します。

誰かが間違ったことを指摘できますか?

答えて

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>(); 
+1

ありがとうございました!魅力のように動作します。私は、MyDictの 'this'修飾子がメンバーvalと動作しないことに注意してください。それ以外のこれは私が探していた答えです。 –

+0

@MichaelTrittin:ありがとう、明らかに私の精神的なコンパイラはまだ完全に機能していません。 ; - ] – ildjarn

関連する問題