steinadler Geschrieben 4. November 2011 Geschrieben 4. November 2011 (bearbeitet) Hallo ihr Lieben, ich möchte eine Eigenschaft eines Objektes über einen Thread zyklisch mit Daten füllen. Aus dem Formular möchte ich dann gern auf diese Daten zugreifen. Wie bekomme ich das denn am elegantesten synchronisiert? Das Objekt selber wird im Formularthread (Hauptthread) erzeugt. Mit OnChanged-Events ist das kein Problem, aber ich dachte eher daran, dass das Formular zyklisch per Timer aufgefrischt wird. Wenn ich jetzt aber zu einem ungünstigen Zeitpunkt (während das Objekt vom Thread gefüllt wird), vom Formular die Eigenschaft des Objektes abfrage, kann dann doch ein nicht definiertes Ergebnis rauskommen. Reicht das, wenn ich um Get/Set der Eigenschaft ein lock{} baue? Edit: "Invoke im Formularcode möchte ich gern umgehen, da das ganze in eine DLL ausgelagert werden soll" Bearbeitet 4. November 2011 von steinadler Zitieren
SilentDemise Geschrieben 4. November 2011 Geschrieben 4. November 2011 Es gibt eigentlich eine relativ simple Regel um Objekte Threadsafe zu machen. Nutze keine Properties ;-) Ich denke ein lock sollte es in diesem fall allerdings tun. Zitieren
steinadler Geschrieben 4. November 2011 Autor Geschrieben 4. November 2011 Es gibt eigentlich eine relativ simple Regel um Objekte Threadsafe zu machen. Nutze keine Properties ;-) Ich denke ein lock sollte es in diesem fall allerdings tun. Aus welchem Grund denn? Zitieren
Pointerman Geschrieben 4. November 2011 Geschrieben 4. November 2011 Moin! Das klingt fuer mich ersteinmal nach dem Erzeuger-Verbraucher-Problem. Schau Dir mal den o.g. Wikipediaartikel an und informiere Dich ausserdem zur Semaphore-Klasse aus System.Threading. Zitieren
SilentDemise Geschrieben 4. November 2011 Geschrieben 4. November 2011 Threading in C# - Part 2 - Basic Synchronization Zitieren
lilith2k3 Geschrieben 4. November 2011 Geschrieben 4. November 2011 Vergiss den ganzen Kram und beschäftige Dich mit Download Details - Microsoft Download Center - Visual Studio Async CTP Unter der kommenden .NET-Version wird das alles ein wenig einfacher :] Ansonsten "Producer-Consumer" ist schon das richtige Pattern. class Producer { Container con; public void Execute() { Thread myThread = new Thread(()=>DoAction()); myThread.IsBackground = true; myThread.Start(); } public Producer(Container Con) { con = Con; } void DoAction() { Random rng = new Random(0); for (int i = 0; i < 10; i++) { Console.WriteLine("Producing {0}", i); lock (con.ContainerLock) { con.FertigeFirmen.Enqueue(System.Guid.NewGuid()); Monitor.Pulse(con.ContainerLock); } Thread.Sleep(rng.Next(2000)); } } } class Consumer { Container con; public void Execute() { Thread myThread = new Thread(() => DoAction()); myThread.IsBackground = true; myThread.Start(); } private void DoAction() { Random rng = new Random(1); for (int i = 0; i < 10; i++) { Console.WriteLine("Consuming {0}", i); lock (con.ContainerLock) { while (con.FertigeFirmen.Count==0) Monitor.Wait(con.ContainerLock); Console.WriteLine(con.FertigeFirmen.Dequeue()); } Thread.Sleep(rng.Next(3500)); } } public Consumer(Container Con) { con = Con; } } class Container { public Queue<Guid> FertigeFirmen = new Queue<Guid>(); public readonly object ContainerLock = new object(); } class Program { static void Main(string[] args) { Container container = new Container(); Producer producer = new Producer(container); Consumer consumer = new Consumer(container); Console.WriteLine("Start!"); producer.Execute(); consumer.Execute(); Console.ReadKey(); } } [/php] Mal so als Anregung. Wenn's ein wenig komplexer sein darf: NServiceBus - The most popular open-source service bus for .net zur asynchronen Kommunikation könnte interessant sein - kommt auf den Anwendungsfall an*g* Zitieren
SilentDemise Geschrieben 4. November 2011 Geschrieben 4. November 2011 CTP gehören aber nicht in Produktivprojekte!! (Trotzdem hast du sowas von Recht ;-) ) Zitieren
steinadler Geschrieben 8. November 2011 Autor Geschrieben 8. November 2011 Vielen Dank für eure Anregungen. Habe dadurch nun eine Möglichkeit gefunden. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.