Laden...

WebService: Datenaustausch / Threads

Erstellt von systemservice vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.922 Views
S
systemservice Themenstarter:in
6 Beiträge seit 2009
vor 14 Jahren
WebService: Datenaustausch / Threads

Hallo,

ich habe folgendes Problem: Ich muss mit einem Intervall von 5 Sekunden Daten aktualisieren, und auf diese Daten mit einem WebService zugreifen.

Ich stelle es mir so vor: ich erstelle eine .NET Anwendung mit einem ständig laufenden Thread, der aktualisierte Daten jede 5 Sekunde in ein Objekt schreibt.
Auf dieses Objekt, das von MarshalByRefObject abgeleitet wäre, würde dann ein WebService mit Remoting zugreifen.

Aber ist das überhaupt nötig? Vielleicht könnte der WebService selbst einen Thread haben, der Daten aktualisiert, und sobald man eine Methode des WebServices aufruft, die aktuellen Daten zurückgeben. Das ist möglich, wenn man eine statische Variable anlegt im WebService anlegt. Aber ist das sinnvoll.

Ich weiß nicht so genau, was im Hintergrund eines WebServices alles passiert, wenn auf darauf zugreift. Anscheinend wird jedes Mal eine neue Instanz erstellt, d.h. ich muss den Thread in einer statischen Funktion starten, sonst würde er in jeder neuen Instanz laufen?

Ok, es sind alles meine Ideen, vlt. sind sie ja alle falsch. Es geht eigentlich um die Problembeschreibung oben. Wie macht man das?

Danke.

E
59 Beiträge seit 2009
vor 14 Jahren

Hi systemservice,

ich bin zwar noch kein Profi aber folgender Vorschlag:

Wie ich das jetzt verstanden habe willst du Informationen alle 5 sekunden mithilfe eines Webservices aufrufen?

Wenn das der Fasll ist kannst du ja ein Timer setzen der alle 5 sekunden deine Daten aktualisiert und auf die du dann mit deinem Webservice zugreifst..


timer = new Timer();
timer.Tick += new EventHandler(timer_Tick);

void timer_Tick(object sender, EventArgs e)
{
      // Aktualisierung deiner Daten 
     // Zugriff auf die Daten mit Webservice
}

Viele Grüße,

emral

S
systemservice Themenstarter:in
6 Beiträge seit 2009
vor 14 Jahren

Hallo emral86,

danke. Ich etwas anderes gemeint. Ich weiß schon wie man einen Thread oder Timer erstellt, der regelmäßig etwas tut.

Es wäre auch kein Problem, wenn es eine einfache Windows-Anwendung wäre. Aber es ist ein WebService und ich weiß nicht wie es sich auswirkt, wenn ich einen Thread oder Timer in einen WebService einbaue. z.B. wenn der WebService 20 mal aufgerufen wird, werden dann im Hintergrund 20 verschiedene Instanzen des WebServices erstellt mit jeweils einem Timer?

Genau das brauche ich nicht, deshalb habe ich eigene Lösungvorschläge beschrieben und wollte dass mir jemand sagt ob es so geht oder was besser wäre.

Ich mache hier ein konkretes Beispiel für das was ich machen würde:
//=====
// A)
// Wenn der WebService Daten nicht nur liefert sondern sie auch selbst regelmäßig aktualisiert, -// dann würde ich wahrscheinlich folgendes machen:
// =====

  1. Wenn möglich eine statische Klasse oder eine normale Klasse aber nur mir statischen Variablen und Methoden als WebService erstellen.
  2. 2 statische Methoden definieren zum Starten und Stoppen des Aktualisierungsthreads.
  3. statisches Objekt, das die Daten speichert.
  4. Thread oder Timer als statische Variable definieren.

Auch wenn der WebService 20 Mal aufgerufen wird und es werden trotzdem 20 Instanzen davon erstellt, wird der Speicher irgendwann vom Garbage Collector freigegeben.
Da das Objekt mit Daten als statisch deklariert wurde und der Thread auch, werden sie nur einmal existieren.

//=====
// B)
// Wenn der WebService Daten nur liefert aber ein anderes Programm sie aktualisiert, dann muss // der WebService auf Daten dieses Programms zugreifen können.
// =====
Das wäre mit Remoting möglich.

// ======
Die Variante A) ist mir lieber, wenn sie wirklich funktioniert und es gibt keinen Grund warum man etwas anderes machen müsste.

P
554 Beiträge seit 2005
vor 14 Jahren

Ein WebService ist nicht selbstständig lauffähig. Man baut mit einem Client eine Verbindung auf und diese Verbindung trennt sich dann automatisch, wenn die Methode abgearbeitet wurde oder ein Timeout aufgetreten ist (Standard 30 Sekunden glaube ich).

Achtung! - Hinter dir ist ein dreiköpfiger Affe!

S
systemservice Themenstarter:in
6 Beiträge seit 2009
vor 14 Jahren

Danke. Ok, das ist mir nicht aufgefallen als ich testweise eine statische Integer-Variable definiert habe und sie in einem Thread ständig um 1 erhöht, es geschah unabhängig von Zugriffen auf den Webservice, aber vielleicht war ja der Timeout noch nicht aufgetreten.

Gut, was kann ich dann noch machen.. Mit Remoting würde es aber funktionieren, oder?

2.891 Beiträge seit 2004
vor 14 Jahren

[...] als ich testweise eine statische Integer-Variable definiert habe und sie in einem Thread ständig um 1 erhöht, es geschah unabhängig von Zugriffen auf den Webservice,[...]

Herrje, nein! WebServices sind zustandslos! Man muss davon ausgehen, dass pro Webserviceaufruf ein neues Exemplar der Webserviceklasse erstellt wird und danach in den Müll kommt.

Was sind denn das für Daten, die da aktualisiert werden? Muss das auch geschehen, selbst wenn niemand drauf zugreift?
Ansonsten wäre wohl ein Dienst am besten geeignet, selbsttätig im Hintergrund regelmäßige Aufgaben auszuführen.

Gruß,
dN!3L

S
systemservice Themenstarter:in
6 Beiträge seit 2009
vor 14 Jahren

Hallo dN!3L, es ist egal wie Daten aktualisiert werden, ob das der WebService macht oder ein anderen Programm (Dienst, Windows-Anwendung...), Hauptsache man kann mit dem WebService auf diese Daten direkt zugreifen ohne warten zu müssen, bis die Aktualisierung fertig ist, deshalb habe ich immer von einem Thread und einem Datenobjekt geredet, es ist völlig egal ob sie Teil des WebService sind oder nicht.
Was ich aber nicht möchte, dass die Daten nach Aktualisierung in einer Datenbank oder Datei gespeichert werden oder WebServer darauf zugreifen muss, am besten wäre es einfach ein Objekt, das die Daten speichert, deshalb habe ich von Remoting gesprochen, weil ich irgendwo gelesen habe, dass man so auf Objekte anderer Domänen zugreifen kann.

Herrje, nein! WebServices sind zustandslos! Man muss davon ausgehen, dass pro Webserviceaufruf ein neues Exemplar der Webserviceklasse erstellt wird und danach in den Müll kommt.

Ja, aber eine statusche Variable eines WebServices bleibt von Zugriffen auf den WebService unabhängig, zumindest für eine bestimmte Zeit bis ein Timeout auftritt, das konnte ich selbst sehen. Ähnlich wie bei einer normalen Klasse mit statischen Membern. Aber Wenn es einen Timeout oder Ähnliches gibt, dann klar, es ist keine Lösung.

2.891 Beiträge seit 2004
vor 14 Jahren

Hallo systemservice,

es ist egal wie Daten aktualisiert werden [...], Hauptsache man kann mit dem WebService auf diese Daten direkt zugreifen ohne warten zu müssen

Hm, da würde ich denken, dass ein separater Dienst, der die Daten ermittelt und dann per Remoting (oder WCF) abgefragt werden kann, mit am besten geeignet ist. Oder du guckst dir mal WCF-Services an, die müssten auch vom ISS gehostet werden können und dürften zustandsbehaftet sein. Zudem kann man mit denen auch SOAP reden.
Brauchst du zwingend einen Webservice? Ansonsten könntest du gleich WCF-Services oder Remoting nehmen.

(

Ja, aber eine statusche Variable eines WebServices bleibt von Zugriffen auf den WebService unabhängig, zumindest für eine bestimmte Zeit bis ein Timeout auftritt, das konnte ich selbst sehen. Das ist allenfalls ein Nebeneffekt der Implementierung des Webservice-Hostings - aber kein spezifiziertes Verhalten. Nur weil man etwas beobachtet, heißt das nicht, dass etwas auch (immer) so ist.){gray}

Gruß,
dN!3L

S
systemservice Themenstarter:in
6 Beiträge seit 2009
vor 14 Jahren

Ich habe es mit einem WebService angefangen, weil ich über SOAP auf die Daten zugreifen muss. Ok, von WCF-Services habe ich noch nicht gehört, ich werds mir anschauen. Danke.

S
systemservice Themenstarter:in
6 Beiträge seit 2009
vor 14 Jahren

Ich habe noch eine Frage. Mit Remoting kann man ja Objekte domainübergreifend verwenden. Geht das nicht mit Prozessen (egal ob dommainübergreifend oder nicht) ?
Ich meine dass man innerhalb eines Prozesses auf Objekte und deren Methoden zugreift, ob das so oder ähnlich geht.
Danke.

2.891 Beiträge seit 2004
vor 14 Jahren

Mit Remoting kann man ja Objekte domainübergreifend verwenden. Geht das nicht mit Prozessen (egal ob dommainübergreifend oder nicht)? Ich meine dass man innerhalb eines Prozesses auf Objekte und deren Methoden zugreift, ob das so oder ähnlich geht.

Häh??
Wenn du auf die Objekte eines anderen Prozesses (oder in einer anderen AppDomain) zugreifen willst, brauchst du irgendeine (objektorientierte) Middleware - z.B. Remoting.
Du kannst Remoting aber auch benutzen, wenn du auf Objekte im selben Prozess zugreifen möchtest.

Gruß,
dN!3L