Προς το περιεχόμενο

c# ConcurrentDictionary.TryRemove


Προτεινόμενες αναρτήσεις

Δημοσ.

Υπαρχει περιπτωση να μην υπαρχει εφοσον κανω ελεγχο οτι υπαρχει πριν κανω remove ;

Ή εγώ νυστάζω και μου φαίνεται "χαζή" η ερώτηση ή εσύ πρέπει να κοιμηθείς  :-D

Δημοσ.

Όχι μόνο διαγράφει κλειδί/τιμή αυτή η εντολή αλλά γυρνάει και την τιμή του, ή "or the default value of the TValue type if key does not exist".

Δεν χρειάζεται να κανείς έλεγχο αν υπάρχει κλειδί πριν κάνεις remove. Αρκεί να ελέγχεις αν έχεις την default value ή όχι.

Λογικά δουλεύει ώστε άμεσα να γίνεται έλεγχος-διαγραφή.

Δημοσ.

Υπαρχει περιπτωση να μην υπαρχει εφοσον κανω ελεγχο οτι υπαρχει πριν κανω remove ;

Αν είσαι single threaded όχι. Αλλά τότε δεν έχεις και λόγο να χρησιμοποιήσεις concurrent dict.

 

Δεν χρειάζεται να κανείς έλεγχο αν υπάρχει κλειδί πριν κάνεις remove. Αρκεί να ελέγχεις αν έχεις την default value ή όχι.

 

Και ποιος σου λέει ότι δεν υπάρχει το κλειδί κανονικά και τυχαίνει να αντιστοιχεί στο default(TValue)?

 

Αν ήταν αρκετό αυτό δε θα χρειαζόταν out parameter που είναι (ήταν τόσα χρόνια) άβολη στη χρήση.

Δημοσ.

Αν θεωρείς την default τιμή στις σωστές τιμές, τότε κάνεις λάθος χρήση της λίστας!

 

Εμμ.... δεν είμαι σίγουρος αν καταλαβαίνεις τι λες.  :)

 

Δηλαδή αν έχω ένα dictionary από οτιδήποτε σε int απαγορεύεται να βάλω κάπου την τιμή μηδέν σε value αλλιώς κάνω λάθος χρήση;

 

Αν έχω dictionary από οτιδήποτε σε οποιοδήποτε reference type απαγορεύεται να βάλω null αλλιώς κάνω λάθος χρήση;

 

Και αυτό το συμπέρασμα προκύπτει επειδή νομίζεις από τη δική σου ερμηνεία της TryRemove ότι αντί να ελέγξεις την out parameter που έβαλαν εκεί ακριβώς γι' αυτό το σκοπό είναι "πιο πρέπον" να κοιτάξεις το return value?

 

Sorry, get your shit together. Αυτά είναι απλώς αστεία.

  • Like 1
Δημοσ.

Αυτο το snip ειναι

       public async Task<string> WaitForRespones(Packet packet)
        {
            packet.Id = PacketId.Next();
            waitingRespones.TryAdd(packet.Id, null);
            await Send(packet);
            for(;
            {
                if(waitingRespones.ContainsKey(packet.Id)
                    && waitingRespones[packet.Id] != null)
                {
                    string s;
                    waitingRespones.TryRemove(packet.Id, out s);
                    return s;
                }
                await Task.Delay(40);
            }
        }
        private bool Filter(long packetId, string packet)
        {
            if(waitingRespones.ContainsKey(packetId))
            {
                waitingRespones[packetId] = packet;
                return true;
            }
            return false;
        }

Αν failαρει θα μπει σε Inf loop

Δημοσ.

Από τη στιγμή του ελέχγου μέχρι την TryRemove μπορεί να έχει αλλάξει το dictionary.

Και τα δύο if πρέπει να είναι μέσα σε lock εφόσον προσθαφερεις στο dictionary από διαφορετικά threads. 

Δημοσ.

Αν είναι να βάλει locks τότε δεν έχει κανένα νόημα να χρησιμοποιεί concurrent dict. Κατά βάση θέλει atomicity σε operation, δε γίνεται μόνο με lock αυτό.

 

Παπί τι ακριβώς προσπαθείς να κάνεις; Single producer/single consumer και έβαλες concurrent dict απλά για να μη γράψεις τα lock? Τότε δε μπορεί να κάνει fail ποτέ.

 

Επίσης δε νομίζω ότι θες να μπεις ποτέ σε infinite logic loop (αν και δεν είναι busy loop) ποτέ, οπότε γιατί κάνεις TryWhatever χωρίς να πετάς exception στα "supposedly can never fail"? Ας πούμε το TryAdd γιατί είναι TryAdd και δεν είναι dict[key] = value? Το TryAdd υπονοεί πως υπάρχουν πολλοί που κάνουν add πράγματα ταυτόχρονα, αλλά στον κώδικά σου δε φαίνεται καμία αναφορά σ' αυτό το σενάριο. Και παρακάτω στη Filter γιατί είναι indexing assignment και όχι TryAdd?

 

Γενικά θα έλεγα το πρόβλημα εδώ είναι πως κάποια πράγματα δε βγάζουν νόημα επειδή ο κώδικας δεν εκφράζει ρητά και σωστά την πρόθεση με την οποία θα χρησιμοποιηθεί.

Δημοσ.

Θελω να παρω response για συγκεκριμνο request πανω σε websocket. Παραλληλα δεν θελω να παω σε send/recv επειδη θελω να παιρνω μνμ απο τον σερβερ χωρις καποιο request. Το παραπανω δουλευει, απλα δεν μαρεσει αυτο το TryXxx

Δημοσ.

Τη γενική ιδέα την κατάλαβα, δες πιο προσεκτικά όμως τι λέω. Γιατί χρησιμοποιείς TryX αφού ο κώδικας φαίνεται πως "δε θέλει" να τα χρησιμοποιήσει;

Δημοσ.

Επειδη δεν εχει σκετο add :P 

Τι λες; να το κανω με = 

και το remove μενει ως εχει; δεν βλεπω να εχει σκετο remove

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...