resueltos otro metodos lista elementos ejercicios diccionarios diccionario dentro anidados agregar dictionary timer f#

dictionary - otro - lista dentro de un diccionario python



F#: Agregar elementos a un diccionario en un temporizador (1)

Estoy creando un programa que carga un archivo de ensamblaje (.dll) y ejecuta métodos dentro del archivo de ensamblaje en un intervalo y luego intenta almacenar el resultado en un diccionario. El código completo para eso está aquí (pastebin.com). Mi problema es que parece que agregar cosas a un diccionario en un temporizador hace que el diccionario no pueda actualizarse. Pude reducir el código relevante que reproduce este problema a lo siguiente:

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()

El resultado, si se ejecuta en una sesión interactiva o en algo así como LINQPad, es una salida de:

seq [] seq [] . . .

Claramente, el diccionario no está cambiando. También confirmé en el depurador de Visual Studio que el diccionario no estaba cambiando. Es casi como si se saltara la línea MyDict.Add. Supongo que esto tiene algo que ver con mi uso de una instrucción type / do, ya que el uso de un temporizador y un diccionario fuera de un tipo parece no ser un problema.

¿Alguien puede señalar lo que hice mal?


El problema está aquí:

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

Esta es una propiedad de solo lectura cuya expresión de retorno es new System.Collections.Generic.Dictionary<string, string>() . Es decir, cada vez que se lee la propiedad, se devuelve un nuevo diccionario diferente. Esto es lo que se vería en C # si eso ayuda:

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

Esto es lo que buscas, usando propiedades implementadas automáticamente :

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

C # equivalente:

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