<?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>Απ: Concurrent Collections and Unique elements</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/67643.aspx</link><pubDate>Thu, 06 Oct 2011 03:50:47 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:67643</guid><dc:creator>Bill </dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/67643.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=67643</wfw:commentRss><description>Όπα το πιασα. Ξεχάστε την ερώτηση την τελευταία το βρήκα.&lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-4.gif" alt="Stick out tongue" /&gt;&lt;br&gt;</description></item><item><title>Απ: Concurrent Collections and Unique elements</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/67642.aspx</link><pubDate>Thu, 06 Oct 2011 03:47:24 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:67642</guid><dc:creator>Bill </dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/67642.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=67642</wfw:commentRss><description>Σε έναν σειριακό crawler / spider συνήθως βάζουν έναν timer ή μια while loop και με το tick πχ σε 2 sec ξανά τρέχει το method και κατεβάζει το επόμενο site. Εδώ εγώ δεν έχω βάλει κανένα timer και κάθε φορά που τελειώνουν τα task μου την δουλειά που κάνουν, ξανά τα δημιουργώ για αυτό και πάντα δίνω τον αριθμό των tasks που θέλω να έχω με την&amp;nbsp; προσέγγιση του n cores --&amp;gt; n-1 tasks . Θέλω να ρωτήσω το πώς θα κάνω τον crawler μου ασταμάτητο συνεχώς να τρέχει χωρίς να βάλω timer και να δημιουργώ εξ'αρχής τα tasks????&lt;br&gt;</description></item><item><title>Απ: Concurrent Collections and Unique elements</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/67641.aspx</link><pubDate>Thu, 06 Oct 2011 03:20:52 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:67641</guid><dc:creator>George J. Capnias</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/67641.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=67641</wfw:commentRss><description>&lt;BLOCKQUOTE&gt;&lt;div&gt;&lt;img src="http://www.dotnetzone.gr/cs/Themes/default/images/icon-quote.gif"&gt; &lt;strong&gt;Παναγιώτης Καναβός:&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Αν σε ενδιαφέρει να δεις πως αντιστοιχίζονται tasks σε threads, θα πρέπει να διαβάσεις για τους &lt;a href="http://msdn.microsoft.com/en-us/library/dd997402.aspx"&gt;Task Schedulers&lt;/a&gt;. Είναι οι κλάσεις οι οποίες αναλαμβάνουν να εκτελέσουν τα διάφορα tasks στα threads που έχουν διαθέσιμα στα δικά τους thread pools. Αν θέλεις, μπορείς να φτιάξεις το δικό σου Task Scheduler ο οποίος μπορεί να έχει κάποιο διαφορετικό pool ή να χρησιμοποιεί κάποιους δικούς σου κανόνες για να αποφασίσει τί θα τρέξει και πότε.&lt;/p&gt;&lt;p&gt;Για παράδειγμα, στα ParallelExtensionExtras υπάρχει o &lt;a href="http://blogs.msdn.com/b/pfxteam/archive/2010/04/09/9990424.aspx"&gt;QueuedTaskScheduler&lt;/a&gt; που καταλαβαίνει από priorities, o ThreadPerTaskScheduler που σηκώνει ένα thread για κάθε task (πλημύρρα!) και άλλοι περίεργοι τύποι.&lt;/p&gt;&lt;p&gt;&lt;/div&gt;&lt;/BLOCKQUOTE&gt;&lt;/p&gt;&lt;p&gt;Σε πόσες γραμμές κώδικα θα μπορούσατε να υλοποιήσετε το &lt;a href="http://quartznet.sourceforge.net/"&gt;Quartz.NET&lt;/a&gt; με τους παραπάνω schedulers; [;-)]&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;George J.&lt;br&gt;&lt;/p&gt;</description></item><item><title>Απ: Concurrent Collections and Unique elements</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/67640.aspx</link><pubDate>Thu, 06 Oct 2011 02:48:09 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:67640</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/67640.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=67640</wfw:commentRss><description>&lt;p&gt;Αν σε ενδιαφέρει να δεις πως αντιστοιχίζονται tasks σε threads, θα πρέπει να διαβάσεις για τους &lt;a href="http://msdn.microsoft.com/en-us/library/dd997402.aspx"&gt;Task Schedulers&lt;/a&gt;. Είναι οι κλάσεις οι οποίες αναλαμβάνουν να εκτελέσουν τα διάφορα tasks στα threads που έχουν διαθέσιμα στα δικά τους thread pools. Αν θέλεις, μπορείς να φτιάξεις το δικό σου Task Scheduler ο οποίος μπορεί να έχει κάποιο διαφορετικό pool ή να χρησιμοποιεί κάποιους δικούς σου κανόνες για να αποφασίσει τί θα τρέξει και πότε.&lt;/p&gt;&lt;p&gt;Για παράδειγμα, στα ParallelExtensionExtras υπάρχει o &lt;a href="http://blogs.msdn.com/b/pfxteam/archive/2010/04/09/9990424.aspx"&gt;QueuedTaskScheduler&lt;/a&gt; που καταλαβαίνει από priorities, o ThreadPerTaskScheduler που σηκώνει ένα thread για κάθε task (πλημύρρα!) και άλλοι περίεργοι τύποι.&lt;/p&gt;</description></item><item><title>Απ: Concurrent Collections and Unique elements</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/67639.aspx</link><pubDate>Thu, 06 Oct 2011 02:38:13 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:67639</guid><dc:creator>Bill </dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/67639.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=67639</wfw:commentRss><description>Με έβαλες σε σκέψεις θα το δω αυτό που λες το να μην δίνω εξαρχής τον αριθμο των Tasks . Ευχαριστώ &lt;br&gt;</description></item><item><title>Απ: Concurrent Collections and Unique elements</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/67635.aspx</link><pubDate>Thu, 06 Oct 2011 00:48:06 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:67635</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/67635.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=67635</wfw:commentRss><description>Κάνεις ένα βασικό λάθος όταν προσπαθείς εσύ να ορίσεις πόσα task θα τρέξουν. Ένα task ΔΕΝ αντιστοιχεί σε ένα thread. To TPL παίρνει τα task που του δίνεις και τα εκτελεί σε δικά του threads τα οποία τραβάει από δικό του thread pool. Είναι δουλειά του TPL να δημιουργήσει τόσα threads όσα μπορεί να εκμεταλλευτεί το μηχάνημα.&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Υποθέτω ότι αφού προσπαθείς να δημιουργήσεις συγκεκριμένο αριθμό tasks μάλλον τα χρησιμοποιείς σαν να είναι ξεχωριστά threads και προσπαθείς το καθένα να διαβάσει από ένα URL μέσα σε loop. Αυτό είναι το δεύτερο λάθος, καθώς ουσιαστικά αχρηστεύει τα tasks. Αντί για tasks που κάνουν ένα συγκεκριμένο πράγμα έχεις τώρα threads τα οποία προσπαθούν να κάνουν πολλά πράγματα μαζί. Λογικό είναι να είναι απαραίτητος αλλά και δύσκολος ο συγχρονισμός μεταξύ αυτών των threads. Ουσιαστικά με αυτό τον τρόπο έχεις αχρηστεύσει τα πλεονεκτήματα που σου δίνει η TPL.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Μία καλύτερη λύση θα ήταν να βάλεις στό BlockingCollection όλα τα URL προς επεξεργασία και κάθε ένα που το επεξεργάζεσαι να το βάζεις σε ένα ConcurrentDictionary. Το dictionary θα πρέπει να το ελέγεις πριν προσθέσεις ένα νέο URL στο queue ή όταν τραβάς ένα για να το επεξεργαστείς. Κάθε φορά πο βρίσκεις ένα νέο URL κατά την επεξεργασία, θα το προσθέτεις και αυτό στο queue. Ο κώδικας θα είναι κάπως έτσι:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;            var queue &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; BlockingCollection&amp;lt;Uri&amp;gt;();

            var visitedUris=&lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; ConcurrentDictionary&amp;lt;Uri, Uri&amp;gt;();

            Parallel.ForEach(queue.GetConsumingEnumerable(), 
                uri =&amp;gt;
                    {
                        &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;//Skip if visited&lt;/span&gt;
                        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (visitedUris.ContainsKey(uri)) 
                            &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt;;

                        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;using&lt;/span&gt; (var client &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; WebClient())
                        {
                            var pageContent &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; client.DownloadString(uri);
                            var discovered &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; Process(pageContent);
                            var newUris &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; from newUri &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;in&lt;/span&gt; discovered
                                          where !visitedUris.ContainsKey(newUri)
                                          select newUri;
                            
                            &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;foreach&lt;/span&gt; (var newUri &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;in&lt;/span&gt; newUris)
                            {
                                queue.Add(newUri);
                            }
                            &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;//Don't care if it fails&lt;/span&gt;
                            visitedUris[uri] &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; uri;
                        }
                    });&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;Με τον τρόπο αυτό αφήνεις το framework να δημιουργήσει όσα threads χρειάζεται αλλά μπορείς και να ελέγχεις εύκολα αν έχεις ήδη επεξεργασθεί μία διεύθυνση.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Εδώ τώρα μπορούν να γίνουν διάφορες τροποποιήσεις. Μπορείς να εκτελέσεις το download ασύγχρονα, εκμεταλλευόμενος την TaskFactory.FromAsync ή να χρησιμοποιήσεις την WebClient.DownloadStringTask από τα &lt;a href="http://blogs.msdn.com/b/pfxteam/archive/2010/05/04/10007557.aspx"&gt;ParallelExtensionExtras&amp;nbsp;&lt;/a&gt;για να κατεβάσεις τις σελίδες ασύγχρονα. Μετά μπορείς να κάνεις την επεξεργασία σε ένα άλλο task με την Task.ContinueWith. Ο κώδικας θα γίνει κάπως έτσι:&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;            Parallel.ForEach(queue.GetConsumingEnumerable(), 
                uri =&amp;gt;
                    {
                        &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;//Skip if visited&lt;/span&gt;
                        &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (visitedUris.ContainsKey(uri)) 
                            &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt;;

                        var client &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;new&lt;/span&gt; WebClient();
                        
                        var pageTask= client.DownloadStringTask(uri);

                        var processTask &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; pageTask.ContinueWith(p =&amp;gt;
                        {
                            client.Dispose();

                            var content &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; p.Result;
                            &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; Process(content);
                        });
                            
                        processTask.ContinueWith(t=&amp;gt;
                        {
                            var discovered=t.Result;
                            var newUris &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; from newUri &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;in&lt;/span&gt; discovered
                                        where !visitedUris.ContainsKey(newUri)
                                        select newUri;
                            &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;foreach&lt;/span&gt; (var newUri &lt;span style="color:Blue;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;in&lt;/span&gt; newUris)
                            {
                                queue.Add(newUri);
                            }
                            &lt;span style="color:Green;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;//Don't care if it fails&lt;/span&gt;
                            visitedUris[uri] &lt;span style="color:Red;background-color:Transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; uri;
                        });                            
                        
                    });&lt;/span&gt;&lt;/pre&gt;Το ωραίο σε όλη τη διαδικασία είναι ότι εσύ δεν χρειάζεται ποτέ να ορίσεις τον αριθμό των Task ή των Threads. Το αναλαμβάνει αυτό το framework.&amp;nbsp;&lt;/div&gt;</description></item><item><title>Απ: Concurrent Collections and Unique elements</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/67629.aspx</link><pubDate>Wed, 05 Oct 2011 07:55:46 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:67629</guid><dc:creator>Markos</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/67629.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=67629</wfw:commentRss><description>Μήπως θα ήταν καλύτερα να χρησιμοποιήσεις το &lt;a href="http://msdn.microsoft.com/en-us/library/dd287191.aspx"&gt;ConcurrentDictionary &lt;/a&gt;αντί του BlockingCollection;&lt;br&gt;</description></item><item><title>Απ: Concurrent Collections and Unique elements</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/67628.aspx</link><pubDate>Wed, 05 Oct 2011 05:19:18 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:67628</guid><dc:creator>Bill </dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/67628.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=67628</wfw:commentRss><description>Δεν βρήκα Parallel Programming να την βάλω &lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-1.gif" alt="Smile" /&gt; .&lt;br&gt;Λοιπόν έχω φτιάξει έναν Parallel Web Crawler όπου κατεβάζει&amp;nbsp; web sites και τα αποθηκεύω στην βάση . Αλλά επειδή το collection μου έχει διπλά και τρίδιπλα μου "βρωμίζει" την βάση με σκουπίδια. Στην αρχή είχα απλό concurrentQueue&amp;nbsp; αλλά έβαλα BlockingCollection επειδή έχει και property Distinct (Το οποίο δεν δοκίμασα) .&lt;br&gt;&amp;nbsp;Συνοπτικά περιγράφω το πως δουλεύει :&lt;br&gt;Με το που τρέξει το πρόγραμμα δημιουργώ n-1 tasks όπου n το πλήθος των λογικών πυρήνων (πχ για core i3 έχουμε 2 πυρήνες με 2 threads ανα πυρήνα έτσι είναι σαν να έχω 4 λογικούς πυρήνες) με το που δώσει ο χρήστης το site για crawl το πρόγραμμα αρχίζει και φορτώνει το collection μου με urls που τυγχόν αναφέρει το συγκεκριμένο site. Κάθε διαθέσιμο Task λαμβάνει ένα url και αρχίζει να το κατεβάζει αλλά και να προσθέτει στο BlockingCollection τα urls Που έχει και αυτο επαναλαμβάνεται στο άπειρο...μέχρι να το τερματίσω.&amp;nbsp; Δεν κάνω Sync μιας και δεν θέλω ,δεν έχει νόημα πιστεύω (κάνω λάθος ??) άλλωστε στόχος μου είναι να είναι ο crawler ταχύτερος απο έναν απλό. Κάθε φορά δημιουργώ n-1 tasks .&lt;br&gt;&amp;nbsp; Δεν θέλω να σας μπλέξω με το πως είναι στημένο απλά αν υπάρχει τρόπος να βάζω εξαρχής ή αργότερα Distinct urls θα με βοηθούσε. &lt;br&gt;&lt;br&gt;</description></item><item><title>Απ: Concurrent Collections and Unique elements</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/67627.aspx</link><pubDate>Wed, 05 Oct 2011 04:52:43 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:67627</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/67627.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=67627</wfw:commentRss><description>Δεν είναι και πολύ "Πρώτα Βήματα" η ερώτηση. Καταρχήν, θα πρέπει να ΜΗΝ βάζεις διπλά και τριπλά στο collection. Θα πρέπει να ελέγξεις τον κώδικα που προσθέτει τιμές για να δεις για ποιό λόγο συμβαίνει αυτό. Θα πρέπει να δώσεις ένα παράδειγμα του κώδικα που προσθέτει τις τιμές για να δούμε τί συμβαίνει.&amp;nbsp;&lt;div&gt;&lt;br&gt;&lt;div&gt;Δεν είναι εγγυημένο ότι ένας έλεγχος του BlockingCollection θα σου δώσει σωστή απάντηση. Παρότι μπορείς άνετα να χρησιμοποιήσεις LINQ extensions όπως την Contains ή την FirstOrDefault για να κάνεις τον έλεγχο, μπορεί κάποιο άλλο thread να προσθέσει μία ίδια τιμή στο collection από τη στιγμή που έκανες τον έλεγχο μέχρι τη στιγμή που έκανες το Add.&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Αλήθεια, τί προσπαθείς να κάνεις? Υπάρχουν διάφορες τεχνικές για να δουλέψεις με Task και ίσως κάποια να αντιμετωπίζει το πρόβλημα σου πολύ ευκολότερα από το να ψάχνεις για διπλές τιμές. Ίσως να μην χρειάζεται καν να χρησιμοποιήσεις το BlockingCollection και μία άλλη τεχνική να βολεύει περισσότερο.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Όπως μου έλεγε και ο Μπιμπούδης, η σημαντικότερη εντολή στις "&lt;a href="http://www.cs.cornell.edu/courses/cs4410/2011fa/papers/commandments.pdf"&gt;12 Εντολές του Synchronization&lt;/a&gt;" είναι&amp;nbsp;&lt;font class="Apple-style-span" color="#ff0000" size="3"&gt;&lt;b&gt;Thou shalt live and die by coding conventions for synchronization.&amp;nbsp;&lt;/b&gt;&lt;/font&gt;Ή με άλλα λόγια, πονάει να ανακαλύπτεις αυτά που έχουν ήδη βρει οι άλλοι&lt;/div&gt;</description></item><item><title>Concurrent Collections and Unique elements</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/67626.aspx</link><pubDate>Wed, 05 Oct 2011 04:02:15 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:67626</guid><dc:creator>Bill </dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/67626.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=67626</wfw:commentRss><description>Έχω κάνει μια εφαρμογή η οποία παίζει με tasks . Έχω ένα BlockingCollection στο οποίο γεμίζω κάποια στοιχεία που θέλω , όλα καλά μέχρι εδώ . Ενώ η εφαρμογή μου παίζει πολύ καλά με τα tasks που έχω , διαπίστωσα πως στο BlockingCollection μου γεμίζει με ίδια στοιχεία. Θα ήθελα να μάθω αν υπάρχει τρόπος να το κάνω να μην βάζει διπλά στοιχεία ή αν υπάρχει τρόπος να πάρω τα Distinct και πως ? Επίσης υπάρχει άλλο Concurrent Collection που να γεμίζει με Distinct τιμές ?&amp;nbsp; &lt;br&gt;&amp;nbsp;Υ.Γ : Το πρόγραμμα μου δεν έχει&amp;nbsp; πρόβλημα με το να έχει το collection μου διπλά ..τριπλά..οκ στοιχεία απλά δεν θέλω να γεμίζει σκουπίδια.&lt;br&gt;</description></item></channel></rss>