Laden...

Zugriff auf Objekt per Timer-Ereignis-Methode möglich ?

Erstellt von alphac vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.334 Views
Thema geschlossen
A
alphac Themenstarter:in
7 Beiträge seit 2014
vor 9 Jahren
Zugriff auf Objekt per Timer-Ereignis-Methode möglich ?

Hallo,

Ich bin dabei die Daten einer Webseite von einem Thread aus zu laden.
In der Methode des Threads läuft die Aufgabe in einer While-Schleife.
Innerhalb der Methode wird eine Seite aufgerufen um JSON-DATEN zu laden und danach ein Sleeptimer von z.b.5 min. sorgt dafür, dass die Quelle der Daten nicht zu oft angefordert wird.

Den Thread habe ich aus einer Main-Methode gestartet.

Nun das eigentliche Problem.
Ich hab ein Ereignis gestartet dass alle 50 ms prüft ob es Änderungen der Daten im Thread gibt.
Nun kann das Objekt des Threads nur innerhalb einer Methode existieren oder als Parameter an eine andere übergeben werden. Wie bekomme ich das Objekt in meine Timer-Ereigniss-Methode?

Auch wenn ich die Konstruktion des Thread-Objekt in die Timer-Methode direkt verlagere, habe ich das Problem, dass alle 50ms ein weitereres Thread-Objekt erzeugt werden würde.

Hier die Klasse für den Thread:


// Thread 

public class GetMiningdaten
{
	// url
	public string URL{set;get;}

	// Zustand
	public bool SeiteGeladen { get; set; }
	public bool LadeprozessGestartet { get; set; }
	public string SeitenInhalt { get; set; }
	public int IntervallMillisekunden { get; set; }
	public bool BeginnWartezeit { get; set; }

	// Abbruchbedingung
	public bool _Stop { get; set; }

	// Initialisierte Klasse
	public GetMiningdaten()
	{
		this.IntervallMillisekunden = 1000 * 60 * 5; // Standart 5 Minuten warten
		this._Stop = false;
	}

	// Main-Methode (Start-Punkt des Threads)
	public void WebDatenLaden()
	{
		while (!this._Stop) // Abbruchbedingung
		{
			// Seitenladevorgang
			this.LadeprozessGestartet = true; // start
			WebClient client = new WebClient();
			this.SeitenInhalt = client.DownloadString("https://.....");
			this.SeiteGeladen = true;
			this.LadeprozessGestartet = false; // ende

			// Pause bis zum erneuten Laden
			this.BeginnWartezeit = true;
			Thread.Sleep(this.IntervallMillisekunden); // Abwarten bis Neustart
			this.BeginnWartezeit = false;
		}
	}


}


und hier ein Ausschnitt aus der Methode von der aus der Thread startet...



        public MainWindow()
        {
			// Timer zum neuladen der Daten
			timer_load.Tick += TimerAenderungCheck;
			timer_load.Interval = TimeSpan.FromMilliseconds(50);
			timer_load.IsEnabled = true;


			InitializeComponent();

			// thread
			GetMiningdaten mining = new GetMiningdaten();
			Thread t = new Thread(mining.WebDatenLaden);
			t.Start();
        }

		void TimerAenderungCheck (object sender, EventArgs e)
		{
			this.CheckThead = true;
		}


J
251 Beiträge seit 2012
vor 9 Jahren

Hey,

Vllt. würde es helfen, wenn dein Objekt GetMiningDaten bescheid gibt, dass sich Daten geändert haben (Events)?

A
alphac Themenstarter:in
7 Beiträge seit 2014
vor 9 Jahren

Könnte "man" theoretisch bestimmt irgendwie machen. Nur das ändert nichts am Problem. Was ist, wenn ich dennoch den Status vom Objekt in bestimmten Intervallen prüfen will?
Das Problem ist für mich ein Grundsätzliches. Vielleicht mach ich ja was ganz Existentielles verkehrt?

Welche Herangehensweisen würde denn ein erfahrener Programmierer bevorzugen?
Komisch ist, dass man diverse Datenfelder ablegen kann, aber keine Objekte?

16.842 Beiträge seit 2008
vor 9 Jahren

Warum musst Du das Objekt prüfen? Wieso reicht es Dir nicht, dass das Objekt (über Events) bekannt gibt, dass sich etwas (und was) ändert?

Komisch ist, dass man diverse Datenfelder ablegen kann, aber keine Objekte?

?! 🤔 Was soll dieser Satz aussagen?
Nicht jeder kann in Deinen Kopf schauen und sehen, was Du damit ausdrücken willst 😉

Vermutlich ist es eine Thematik, dass Dir jegliche Grundlagen der [Artikel] Multi-Threaded Programmierung hier fehlen =)

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo alphac,

ich würde einen Schritt weiter gehen und schon fehlende Kenntnis Grundlagen der Sprache C# vermuten.

Nun kann das Objekt des Threads nur innerhalb einer Methode existieren oder als Parameter an eine andere übergeben werden. Wie bekomme ich das Objekt in meine Timer-Ereigniss-Methode?

Die Aussage ist falsch, denn außer lokalen Variablen und Parametern gibt es natürlich auch Instanzvariablen (und statische). Das ist - so wie ich es verstanden habe - was du hier suchst.

Sollte ich recht haben, beachte bitte [Hinweis] Wie poste ich richtig? Punkt 1.1.1 und stelle in diesem Fall bitte keine Nachfragen dazu, denn würden sicher unter den gleichen Punkt fallen.

herbivore

A
alphac Themenstarter:in
7 Beiträge seit 2014
vor 9 Jahren

Ich üb mich noch in der Sprache 😉

Ja ich meine Instanzvariablen, die in Objekten liegen. Hoffe mich richtig ausgedrückt zu haben.
Ich hab den Thread auch schon als Klasse mit statischen Methoden und Feldern getestet, jedoch dachte ich, dass es eleganter wäre ein Objekt zu konstruieren und es im Thread laufen zu lassen. Von "Außen" wollte ich dann den Zustand abfragen, bzw halt abfragen welche Änderungen im Objekt stattgefunden haben.

Das klappt ja auch alles gut, wenn es selbst alles innerhalb einer Methode stattfindet. Man kann auch das Objekt weiterreichen und in einer anderen Methode verarbeiten wo man die Daten benötigt. Nur hatte ich keine Möglichkeit gesehen, dass ich eine Eventmethode über einen Timer mit dem Objekt in Verbindung bringe um z.B. zu schauen ob neue Daten vorhanden sind oder ob der Thread gerade die Webseite anfordert.

Hinweis von herbivore vor 9 Jahren

Das du dich übst, ist löblich. Schau auch mal in [FAQ] Wie finde ich den Einstieg in C#?

Beachte bitte trotzdem [Hinweis] Wie poste ich richtig? Punkt 1.1.1. Was du willst, geht wie gesagt mit Instanzvariablen. Die konkrete Umsetzung ist deine Aufgabe.

Thema geschlossen