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;
}
Hey,
Vllt. würde es helfen, wenn dein Objekt GetMiningDaten bescheid gibt, dass sich Daten geändert haben (Events)?
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?
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 =)
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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
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.
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.