Queue Locken



  • object item;
    if (queue.Count > 0)
    {
      lock (queue)
      {
        if (queue.Count > 0)
        {
           item = queue.Dequeue();
        }
      }
    }
    

    Hallo zusammen,

    kann Jemand mir sagen , wie ich den Status des Queues abfragen wenn ich es Queue wie oben locke. Meine Idee ist, dass wenn das Queue gerade gelockt ist, in einem anderen die Daten zuzufügen.

    Danke im Voraus.
    Lars



  • Welches Framework benutzt du? Mit dem 4er sind ConcurentQueues mit ausgeliefert wurden die das alles fuer dich automatisch machen. Ansonsten weiss ich nich ganz recht was du mit Status meinst?



  • Firefighter schrieb:

    Welches Framework benutzt du? Mit dem 4er sind ConcurentQueues mit ausgeliefert wurden die das alles fuer dich automatisch machen. Ansonsten weiss ich nich ganz recht was du mit Status meinst?

    Ja, ich verwende 4.0.

    es gibt 2 Threads bei mir. Einer füttert Queue mit dem Daten, der andere ließt.

    Das Problem ist, dass während der zweite Thread das Queue lockt und die Daten aus dem Queue ausließt, der erste Thread verliert ca 5 Daten Sätze(jeder 6ms kommt ein Datensatz.).

    Ich will prüfen ob eventuell Queue gelockt ist, dann werde ich in der Zeit in einem anderen Queue zufügen kann.



  • Ich habe deinen letzten Beitrag ca. 5 Mal durchgelesen und verstehe immer noch nicht was du genau vorhast bzw. was genau das Problem ist.
    Beschreibe nochmals in ganzen und klaren Saetzen was du machen moechtest und wo das Problem liegt. Eventuell auch mit etwas mehr Code.



  • Ohne Code nix los.

    Hier kannst Du nachlesen, wie man eine Producer-Consumer-Queue baut:
    http://www.albahari.com/threading/part4.aspx#_Wait_Pulse_Producer_Consumer_Queue



  • Queue queue0 ;
     Queue queue1 ;
    
    funktion1
    {
    object item;
    if (queue0.Count > 0)
    {
      lock (queue0)
      {
        if (queue0.Count > 0)
        {
           item = queue0.Dequeue();
        }
      }
    } 
    }
    
    funktion2  // zur Zeit ohne Prüfung die Items einfach zugefügt.
    {
    
    object item;
    
    queue0.Enqueue(item) 
    
    }
    
    // Mein Ziel
    
    funktion2  // zur Zeit ohne Prüfung die Items einfach zugefügt.
    {
    
    object item;
    
    if(!queue0.isLocked)    // gibt es solche Funktion?
    
    queue0.Enqueue(item) 
    
    else
    queue1.Enqueue(item)
    
    }
    
     Der Vorschlag von Firefighter siet gar nicht mal schlect aus.  Aber wenn eine Möglichkeit zur Status Prüfung gäbe, wäre nicht schlect.
    


  • Warum Pseudocode?

    lars123 schrieb:

    if(!queue0.isLocked)    // gibt es solche Funktion?
    

    System.Threading.Monitor.TryEnter kommt dem was Du suchst wohl am nächsten.
    Lies Dir bitte obigen Link durch.



  • genau das habe ich gesucht:

    ______________________________________________________________

    public static bool TryEnter (
    	Object obj,
    	int millisecondsTimeout
    )
    

    Parameter

    obj

    Das Objekt, für das die Sperre erhalten werden soll.

    millisecondsTimeout

    Die Anzahl der Millisekunden, für die auf die Sperre gewartet werden soll.

    Rückgabewert
    true, wenn der aktuelle Thread die Sperre erhält, andernfalls false.



  • Vielen Dank.

    mit Hilfe der Funktion TryEnter() konnte ich das Problem lösen.



  • Ich denke es wäre vernünftiger wenn du das Grundproblem in deinem Code beseitigst, nämlich den Grund warum die Queue für 30ms (5 Records * 6ms) gelockt bleibt.
    Dann brauchst du auch kein Monitor.TryEnter.


Anmelden zum Antworten