Laden...

Eine serverseitige Funktion nur seriell ausführen

Erstellt von f.ritz vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.445 Views
f.ritz Themenstarter:in
341 Beiträge seit 2004
vor 16 Jahren
Eine serverseitige Funktion nur seriell ausführen

Hallo zusammen!

Kann man eigentlich einer Funktion (in einer ASP.NET-Anwendung) sagen, dass diese, auf dem Webserver, nur seriell verarbeitet werden darf?

664 Beiträge seit 2005
vor 16 Jahren

Was willst du denn erreichen?

f.ritz Themenstarter:in
341 Beiträge seit 2004
vor 16 Jahren

Ich möchte auf eine MS Message Queue schreiben. Dabei ist die Reihenfolge der gespeicherten Messages von großer Bedeutung. Die Messages werden innerhalb einer Funktion in der Schleife reingeschrieben.

664 Beiträge seit 2005
vor 16 Jahren

Etwas mehr Informationen solltest du schon bringen, sonst kann man nichts dazu sagen.
Wenn du in einer Schleife in die Queue schreibst, dann werden die Nachrichten doch sequentiell abgearbeitet?!

f.ritz Themenstarter:in
341 Beiträge seit 2004
vor 16 Jahren

Es ist eigentlich ganz einfach, es gibt eine Funktion mit einer Schleife drin:


using System.Web.UI.WebControls;
......
public partial class _Default : System.Web.UI.Page 
{
....
    protected void Button_Click(object sender, EventArgs e)
    {
     ...
      for(int i=0;i<4;i++)
      {
         //In die Queue schreiben
      }
    }
}

Also wenn die Funktion/Event Button_Click(...) ausgeführt wird, dann soll die Verarbeitung sequentiell auf dem Webserver passieren. D.h. das wenn sich zwei Benutzer angemeldet haben und gleichzeitig auf den Button klicken dann soll diese Funktion nicht in einzelnen Threads sondern sondern sequentiell verarbeitet werden. Ich möchte somit verhindern dass die Einträge in der Message Queue nicht durcheinander kommen.

f.ritz Themenstarter:in
341 Beiträge seit 2004
vor 16 Jahren

Ich galube das müsste aber reichen:


using System.Web.UI.WebControls;
......
public partial class _Default : System.Web.UI.Page
{
 public static string lockvar = string.Empty;
....
    protected void Button_Click(object sender, EventArgs e)
    {
     ...
      lock (lockvar)
      {
         for(int i=0;i<4;i++)
        {
           //In die Queue schreiben
        }
      }
    }
}

Was meint Ihr?

2.760 Beiträge seit 2006
vor 16 Jahren

Hmm... ich bezweifle das das reichen wird da du ja schon geschrieben hast:

das wenn sich zwei Benutzer angemeldet haben und gleichzeitig auf den Button klicken dann soll diese Funktion nicht in einzelnen Threads sondern sondern sequentiell verarbeitet werden.

und ich ebenfalls vermute das jeder Benutzer auf dem Server eine eigene Session bekommt (ohne tiefere Kenntnisse der Materie zu haben).

Nach meinem Verständnis wäre es fatal wenn lock() reichen bzw. für deinen Fall funktionieren würde.

Wo ist deine Queue denn (externer Dienst...)? Würde es nicht reichen dem Eintrag einen Timestamp mitzugeben und anhand diesem dann die Daten zu verarbeiten?

Sollte ich falsch liegen korregiert mich bitte.

f.ritz Themenstarter:in
341 Beiträge seit 2004
vor 16 Jahren

Wenn ich, also, dich richtig verstanden habe, dann gibt es keine Möglichkeit einer Funktion so zu gekennzeichnen dass diese nur sequentiell verarbeitet wird. Ich muss also diese Logik iregendwie selbst implementieren.
Die Queue ist ein externer Dienst und die Herausforderung liegt daran, dass die Einträge immer in der gleichen Reihenfolge vorliegen X(

2.760 Beiträge seit 2006
vor 16 Jahren

Da wäre der Timestamp doch eine Alternative.

f.ritz Themenstarter:in
341 Beiträge seit 2004
vor 16 Jahren

Das Problem ist - ich habe keinen Einfluß auf das Auslesen der Messages diese müssen in der richtigen Reihenfolge, mit einem bestimmten Ihalt gefüllt sein. Ich werde es dann wahrscheinlich so lösen, dass ich den Zustand einfach in der DB oder Datei speichere und dementsprechend Sperrungen setze.

3.971 Beiträge seit 2006
vor 16 Jahren

Eine (temporäre) Datenbank (im Speicher) wäre da denk ich eine gute Variante, wo du dann nach genau deinem Wünschen die Messages in der richtigen Reihenfolge ausließt. SessionID und Timestamp wäre glaubig da ganz praktisch

Ansonsten würde ich eine spezielle Queue-Klasse schreiben, die genau das macht was du vorhast, zur Lockung müssten dann Mutexe eingesetzt werden (Prozessübergreifend)

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...