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
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.
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?
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.
SilentDemise Geschrieben 4. November 2011 Geschrieben 4. November 2011 Threading in C# - Part 2 - Basic Synchronization
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*
SilentDemise Geschrieben 4. November 2011 Geschrieben 4. November 2011 CTP gehören aber nicht in Produktivprojekte!! (Trotzdem hast du sowas von Recht ;-) )
steinadler Geschrieben 8. November 2011 Autor Geschrieben 8. November 2011 Vielen Dank für eure Anregungen. Habe dadurch nun eine Möglichkeit gefunden.
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden