<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>.NET Framework</title><link>https://www.dotnetzone.gr:443/cs/forums/14/ShowForum.aspx</link><description>Θέματα για threading, remoting, reflection, exception handling, security, regex κλπ.</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: Iteration σε List&lt;Τ&gt; με μεταβλητό μεγεθος!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/74585.aspx</link><pubDate>Tue, 05 Nov 2013 20:05:07 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:74585</guid><dc:creator>Panagiotis Kefalidis</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/74585.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=74585</wfw:commentRss><description>Το μόνο που δεν ξέρω είναι εάν το TPL Target pack για 4.0 (όπως και το Async) το περνάει.</description></item><item><title>Απ: Iteration σε List&lt;Τ&gt; με μεταβλητό μεγεθος!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/74584.aspx</link><pubDate>Tue, 05 Nov 2013 19:53:49 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:74584</guid><dc:creator>Panagiotis Kefalidis</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/74584.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=74584</wfw:commentRss><description>Το μόνο πρόβλημα είναι ότι το TPL DataFlow είναι διαθέσιμο σε 4.5 κι όχι σε 4.0, οπότε θα πρέπει να αρκεστεί σε Task και ContinueWith (χοντρικά)&amp;nbsp;αμα θέλει να κάνει chain από βήματα. Βέβαια το ότι θα χρησιμοποιήσει Task δεν σημαίνει ότι θα τρέξει και σε ξεχωριστά thread, αλλά αυτό είναι άλλο θέμα υποθέτω.</description></item><item><title>Απ: Iteration σε List&lt;Τ&gt; με μεταβλητό μεγεθος!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/74582.aspx</link><pubDate>Tue, 05 Nov 2013 18:06:55 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:74582</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/74582.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=74582</wfw:commentRss><description>&lt;P&gt;Πλησιάζουμε, πλησιάζουμε! &lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-4.gif" alt="Stick out tongue" /&gt;&lt;/P&gt;
&lt;P&gt;Το σενάριο είναι πολύ συνηθισμένο σε multithreaded εφαρμογές και έχει και όνομα: Producer/Consumer. Απλά και μόνο ψάχνοντας με αυτά τα keywords θα βρεις πολλές τεχνικές για να το αντιμετωπίσεις.&lt;/P&gt;
&lt;P&gt;Στο .NET 4 και άνω υπάρχουν πολλοί τρόπο να το αντιμετωπίσεις και κανένας δεν χρειάζεται lock.&lt;/P&gt;
&lt;P&gt;Μία περίπτωση είναι να χρησιμοποιήσεις το &lt;A href="http://msdn.microsoft.com/en-us/library/dd267312(v=vs.100).aspx"&gt;BlockingCollection&lt;/A&gt;&amp;nbsp;(το οποίο εσωτερικά χρησιμοποιεί το ConcurrentQueue). Το ένα thread γράφει στο collection ενώ το άλλο είτε καλεί την &lt;A href="http://msdn.microsoft.com/en-us/library/dd287186(v=vs.100).aspx"&gt;GetConsumingEnumerable()&lt;/A&gt; για να διαβάσει, ή καλεί την &lt;A href="http://msdn.microsoft.com/en-us/library/dd287085(v=vs.100).aspx"&gt;Take()&lt;/A&gt;&amp;nbsp;για να μπλοκάρει μέχρι να γραφτεί κάτι στο collection. Το BlockingCollection εσωτερικά χρησιμοποιεί το ConcurrentQueue αλλά μπορείς να το αντικαταστήσεις με το &lt;A href="http://msdn.microsoft.com/en-us/library/dd267331(v=vs.110).aspx"&gt;ConcurrentStack&lt;/A&gt; ή οποιοδήποτε άλλο collection υλοποιεί το &lt;A href="http://msdn.microsoft.com/en-us/library/dd287147(v=vs.100).aspx"&gt;IProducerConsumerCollection&lt;/A&gt;&amp;nbsp;interface και σου δίνει την queueing συμπεριφορά που θέλεις (π.χ. priority queue?)&lt;/P&gt;
&lt;P&gt;Και πριν διαμαρτυρηθεί ο Νίκος ο Παλλαδινός, το κύριο μειονέκτημα του BlockingCollection είναι ότι ... μπλοκάρεις όντως ένα thread που περιμένει μέχρι να του δώσεις δεδομένα.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;Άλλη λύση, είναι να χρησιμοποιήσεις το ActionBlock του &lt;A href="http://msdn.microsoft.com/en-us/library/hh228603.aspx"&gt;TPL DataFlow&lt;/A&gt;. Το &lt;A href="http://msdn.microsoft.com/en-us/library/hh194684.aspx"&gt;ActionBlock&lt;/A&gt; δέχεται δεδομένα ως input, τα επεξεργάζεται με ένα ή περισσότερα δικά του threads (χωρίς να μπλοκάρει) και γράφει το αποτέλεσμα σε ένα output buffer. Μπορείς να συνδέσεις blocks μεταξύ τους σε ένα Pipeline και π.χ. το ένα να επεξεργάζεται τα inputs και το επόμενο να αποθηκεύει τα αποτελέσματα στη βάση όπως έρχονται.&lt;/P&gt;
&lt;P&gt;Το ωραίο με το DataFlow είναι ότι μπορείς να συνδέσεις πολλά βήματα μεταξύ τους σαν Lego και να έχεις το καθένα να εκτελείται σε ξεχωριστό thread. Αυτό απλουστεύει απίστευτα τον προγραμματισμό του κάθε βήματος καθώς το καθένα είναι απομονωμένο και δεν σε απασχολεί πως θα τα συγχρονίσεις ή πως θα διαχειριστείς τα threads. Μπορείς έτσι να σπάσεις την επεξεργασία σε πολύ περισσότερα κομμάτια απ' ότι με ένα μόνο BlockingCollection&lt;/P&gt;</description></item><item><title>Απ: Iteration σε List&lt;Τ&gt; με μεταβλητό μεγεθος!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/74572.aspx</link><pubDate>Mon, 04 Nov 2013 04:05:49 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:74572</guid><dc:creator>George J. Capnias</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/74572.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=74572</wfw:commentRss><description>&lt;p&gt;Καλησπέρα,&lt;/p&gt;&lt;p&gt;Ο χρόνος που θα πάρει μια εγγραφή στην βάση μπορεί να είναι από&amp;nbsp;δεκάδες milliseconds - αν η βάση είναι άδεια - σε μερικές εκατοντάδες milliseconds&amp;nbsp; - αν η βάση έχει μερικές χιλιάδες records - και μπορεί να φτάσε τα seconds, αν έχεις related πίνακες και εκατομμύρια εγγραφές.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Αν αυτό που θέλεις είναι να&amp;nbsp;φτιάξεις ένα queue, για προσωρινή αποθήκευση των εγγραφών, πριν&amp;nbsp;μπουν στην βάση από ένα ασύγχρονο μηχανισμό, ίσως θα έπρεπε να κοιτάς προς την μεριά του ConcurrentQueue (&lt;a href="http://msdn.microsoft.com/en-us/library/dd267265(v=vs.110).aspx"&gt;http://msdn.microsoft.com/en-us/library/dd267265(v=vs.110).aspx&lt;/a&gt;). Μπορείς να δεις αν έχει μέσα στοιχεία, και να τα χειριστείς χωρίς να πρέπει να κλειδώσεις το αντικείμενο, έστω και αν πρέπει να κάνεις iteration σε αυτά...&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;George J.&amp;nbsp;&lt;/p&gt;</description></item><item><title>Απ: Iteration σε List&lt;Τ&gt; με μεταβλητό μεγεθος!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/74570.aspx</link><pubDate>Sun, 03 Nov 2013 22:00:24 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:74570</guid><dc:creator>Alexpap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/74570.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=74570</wfw:commentRss><description>&lt;p&gt;Ο χρόνος που θα χρειαστεί να μείνει lockαρισμενο το object είναι όσο χρειάζεται η εγγραφή ενός record σε ένα table σε μια βάση δεδομένων, για αυτό ρώτησα και αν θεωρείται ως μια "σωστή" λύση. Χρησιμοποιώ .NET 4.0, άλλα το object που προτείνεις είναι Dictionary, και εγώ θέλω την λίστα πιο πολύ σαν μια ουρά, που θα μπαίνουν object μέσα, που περιμένουν προς εξυπηρέτηση-αφαίρεση από την λίστα.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Μετά&lt;font size="2"&gt;&amp;nbsp;&lt;/font&gt;από&lt;font size="2"&gt;&amp;nbsp;λίγο ψάξιμο&amp;nbsp;πάνω&amp;nbsp;στο&amp;nbsp;θέμα&amp;nbsp;"thread-safe lists" βρήκα το ConcurrentBag&amp;lt;T&amp;gt; (&amp;nbsp;&lt;/font&gt;&lt;a style="font-size:10pt;" href="http://msdn.microsoft.com/en-us/library/dd381779.aspx"&gt;http://msdn.microsoft.com/en-us/library/dd381779.aspx&lt;/a&gt;&amp;nbsp;&lt;font size="2"&gt;),&amp;nbsp;&lt;/font&gt;αλλά&lt;font size="2"&gt;&amp;nbsp;δεν&amp;nbsp;έχω&amp;nbsp;άποψη καθώς δεν το&amp;nbsp;έχω&amp;nbsp;ξαναχρησιμοποιήσει.&lt;/font&gt;&lt;/p&gt;</description></item><item><title>Απ: Iteration σε List&lt;Τ&gt; με μεταβλητό μεγεθος!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/74551.aspx</link><pubDate>Mon, 28 Oct 2013 01:31:25 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:74551</guid><dc:creator>Panagiotis Kefalidis</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/74551.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=74551</wfw:commentRss><description>&lt;p&gt;Θα μπορούσες να χρησιμοποιήσεις ConcurrentDictionary που είναι φτιαγμένο για Concurrent access ή απλά να κάνεις copy πριν το Iteration εάν η λίστα δεν είναι μεγάλη ώστε να μην ξοδεύεις πολύ μνήμη. Το να το lockareis θα σου σκοτώσει αρκέτα το performance εάν παραμένει lockarismeno για αρκετή ώρα κάθε φορά.&lt;/p&gt;&lt;p&gt;&amp;nbsp;Αυτό που με παραξενεύει είναι ότι χρησιμοποιείς List&amp;lt;T&amp;gt; το οποίο το κάνουν access διάφορα threads ενώ το data structure δεν είναι thread-safe έτσι κι αλλοιώς. Ήδη θα έχεις προβλήματα, ανεξάρτητα απο το Iteration. Πως το έλυσες αυτό τώρα; Η΄ δεν το έλυσες καθόλου; Τώρα εάν δεν χρησιμοποιείς .NET 4.0 και νεότερο, τα Concurrent Collection που είπα πριν δεν υπάρχουν, οπότε θα πρέπει να το lockareis αναγκαστικά, αλλά θα πρέπει να φτιάξεις methods τα οποία κάνουν το Add/Remove έτσι κι αλλοιώς γιατί όπως είπα έχεις και τώρα πρόβλημα, απλά δεν έσκασε ακόμα. Διαφορετικά το Performance πάει περίπατο. &lt;/p&gt;&lt;p&gt;Δες εδώ -&amp;gt; &lt;a href="http://msdn.microsoft.com/en-us/library/system.collections.icollection.issynchronized(v=vs.90).aspx"&gt;http://msdn.microsoft.com/en-us/library/system.collections.icollection.issynchronized(v=vs.90).aspx&lt;/a&gt;&amp;nbsp;υπάρχει η απάντηση για το πως να το lockareis σωστά για iteration κλπ.&lt;/p&gt;</description></item><item><title>Iteration σε List&lt;Τ&gt; με μεταβλητό μεγεθος!</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/74547.aspx</link><pubDate>Sun, 27 Oct 2013 01:52:22 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:74547</guid><dc:creator>Alexpap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/74547.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=74547</wfw:commentRss><description>&lt;p&gt;Καλησπέρα σε όλους,&lt;/p&gt;&lt;p&gt;Έχω ένα object τύπου List&amp;lt;T&amp;gt;, το οποίο χρησιμοποιείται ως κοινό resource από κάποια threads. Κάνοντας iterate την λίστα, υπάρχει περίπτωση να αλλάξει το πλήθος των στοιχείων από κάποιο από τα threads, με αποτέλεσμα να δημιουργείται πρόβλημα σε ένα for...each loop. Σκέφτηκα να χρησιμοποιήσω την εντολή lock(), για να κλειδώνει το object κάθε φορά που θα ελέγχει τα στοιχεία της. Υπάρχει κάποιος καλύτερος/σωστότερος τρόπος?&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;ΥΓ: Το thread που κάνει loop στην λίστα τρέχει συνεχώς, οπότε και κάποιο στοιχείο να μην μπει την ώρα του ελέγχου θα μπει μόλις τελειώσει.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;Ευχαριστώ εκ των προτέρων&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description></item></channel></rss>