παπι Δημοσ. 7 Νοεμβρίου 2017 Δημοσ. 7 Νοεμβρίου 2017 Στα docs κατω κατω λεει Return ValueType: System.Boolean true if the object was removed successfully; otherwise, false. Οταν λεει otherwise? υπαρχει περίπτωση να μην γινει remove;
παπι Δημοσ. 7 Νοεμβρίου 2017 Μέλος Δημοσ. 7 Νοεμβρίου 2017 Υπαρχει περιπτωση να μην υπαρχει εφοσον κανω ελεγχο οτι υπαρχει πριν κανω remove ;
kaliakman Δημοσ. 7 Νοεμβρίου 2017 Δημοσ. 7 Νοεμβρίου 2017 Υπαρχει περιπτωση να μην υπαρχει εφοσον κανω ελεγχο οτι υπαρχει πριν κανω remove ; Ή εγώ νυστάζω και μου φαίνεται "χαζή" η ερώτηση ή εσύ πρέπει να κοιμηθείς
albNik Δημοσ. 7 Νοεμβρίου 2017 Δημοσ. 7 Νοεμβρίου 2017 Υπαρχει περιπτωση να μην υπαρχει εφοσον κανω ελεγχο οτι υπαρχει πριν κανω remove ; Εννοείται.
solarpower Δημοσ. 7 Νοεμβρίου 2017 Δημοσ. 7 Νοεμβρίου 2017 Όχι μόνο διαγράφει κλειδί/τιμή αυτή η εντολή αλλά γυρνάει και την τιμή του, ή "or the default value of the TValue type if key does not exist". Δεν χρειάζεται να κανείς έλεγχο αν υπάρχει κλειδί πριν κάνεις remove. Αρκεί να ελέγχεις αν έχεις την default value ή όχι. Λογικά δουλεύει ώστε άμεσα να γίνεται έλεγχος-διαγραφή.
defacer Δημοσ. 7 Νοεμβρίου 2017 Δημοσ. 7 Νοεμβρίου 2017 Υπαρχει περιπτωση να μην υπαρχει εφοσον κανω ελεγχο οτι υπαρχει πριν κανω remove ;Αν είσαι single threaded όχι. Αλλά τότε δεν έχεις και λόγο να χρησιμοποιήσεις concurrent dict. Δεν χρειάζεται να κανείς έλεγχο αν υπάρχει κλειδί πριν κάνεις remove. Αρκεί να ελέγχεις αν έχεις την default value ή όχι. Και ποιος σου λέει ότι δεν υπάρχει το κλειδί κανονικά και τυχαίνει να αντιστοιχεί στο default(TValue)? Αν ήταν αρκετό αυτό δε θα χρειαζόταν out parameter που είναι (ήταν τόσα χρόνια) άβολη στη χρήση.
solarpower Δημοσ. 7 Νοεμβρίου 2017 Δημοσ. 7 Νοεμβρίου 2017 Αν θεωρείς την default τιμή στις σωστές τιμές, τότε κάνεις λάθος χρήση της λίστας!
defacer Δημοσ. 7 Νοεμβρίου 2017 Δημοσ. 7 Νοεμβρίου 2017 Αν θεωρείς την default τιμή στις σωστές τιμές, τότε κάνεις λάθος χρήση της λίστας! Εμμ.... δεν είμαι σίγουρος αν καταλαβαίνεις τι λες. Δηλαδή αν έχω ένα dictionary από οτιδήποτε σε int απαγορεύεται να βάλω κάπου την τιμή μηδέν σε value αλλιώς κάνω λάθος χρήση; Αν έχω dictionary από οτιδήποτε σε οποιοδήποτε reference type απαγορεύεται να βάλω null αλλιώς κάνω λάθος χρήση; Και αυτό το συμπέρασμα προκύπτει επειδή νομίζεις από τη δική σου ερμηνεία της TryRemove ότι αντί να ελέγξεις την out parameter που έβαλαν εκεί ακριβώς γι' αυτό το σκοπό είναι "πιο πρέπον" να κοιτάξεις το return value? Sorry, get your shit together. Αυτά είναι απλώς αστεία. 1
παπι Δημοσ. 7 Νοεμβρίου 2017 Μέλος Δημοσ. 7 Νοεμβρίου 2017 Αυτο το 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
albNik Δημοσ. 7 Νοεμβρίου 2017 Δημοσ. 7 Νοεμβρίου 2017 Από τη στιγμή του ελέχγου μέχρι την TryRemove μπορεί να έχει αλλάξει το dictionary. Και τα δύο if πρέπει να είναι μέσα σε lock εφόσον προσθαφερεις στο dictionary από διαφορετικά threads.
defacer Δημοσ. 7 Νοεμβρίου 2017 Δημοσ. 7 Νοεμβρίου 2017 Αν είναι να βάλει 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? Γενικά θα έλεγα το πρόβλημα εδώ είναι πως κάποια πράγματα δε βγάζουν νόημα επειδή ο κώδικας δεν εκφράζει ρητά και σωστά την πρόθεση με την οποία θα χρησιμοποιηθεί.
παπι Δημοσ. 7 Νοεμβρίου 2017 Μέλος Δημοσ. 7 Νοεμβρίου 2017 Θελω να παρω response για συγκεκριμνο request πανω σε websocket. Παραλληλα δεν θελω να παω σε send/recv επειδη θελω να παιρνω μνμ απο τον σερβερ χωρις καποιο request. Το παραπανω δουλευει, απλα δεν μαρεσει αυτο το TryXxx
defacer Δημοσ. 7 Νοεμβρίου 2017 Δημοσ. 7 Νοεμβρίου 2017 Τη γενική ιδέα την κατάλαβα, δες πιο προσεκτικά όμως τι λέω. Γιατί χρησιμοποιείς TryX αφού ο κώδικας φαίνεται πως "δε θέλει" να τα χρησιμοποιήσει;
παπι Δημοσ. 7 Νοεμβρίου 2017 Μέλος Δημοσ. 7 Νοεμβρίου 2017 Επειδη δεν εχει σκετο add Τι λες; να το κανω με = και το remove μενει ως εχει; δεν βλεπω να εχει σκετο remove
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα