<?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>Απ: SQLConnection Μέσα από Threads με το ίδιο SQLConnectionString</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/47279.aspx</link><pubDate>Tue, 30 Dec 2008 05:18:43 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:47279</guid><dc:creator>pontifikas</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/47279.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=47279</wfw:commentRss><description>Παναγιώτη σε ευχαριστώ για την απάντηση αλλά στην προσπάθειά μου να μην μακρυγορήσω παράλλαξα κάπως αυτό που πραγματικά κάνω.&lt;br&gt;Εξακολουθώ να έχω πρόβλημα.&lt;br&gt;Βασικά, προσπαθώ να προσομοιώσω αισθητήρες. Κάθε αισθητήρας συνδέεται με έναν κεντρικό κόμβο(Intermediate). &lt;br&gt;Δίνω το δικαίωμα και οι Intermediates να συνδέονται με έναν το πολύ Intermediate (Δέντρο με ένα ή δύο επίπεδα και φύλα τους κόμβους).&lt;br&gt;Εικονικά, στον κεντρικό βρίσκεται η ΒΔ και σε τακτά χρονικά δεδομένα στέλνουν εκεί τα δεδομένα τους οι αισθητήρες. Για κάθε αισθητήρα έχω ένα table.&lt;br&gt;Έχω υλοποιήσει τους κεντρικούς κόμβους σαν Backgroundworkers οι οποίοι δημιουργούν τους Sensors του group τους σαν Backgroundworkers επίσης.&lt;br&gt;Κάθε intermediate έχει μια λίστα με κάθε Sensor που έχει δημιουργήσει και ανήκει στο Group του.&lt;br&gt;Επίσης έχει και λίστα με του Intermediates που μπορεί να είναι συνδεδεμένοι με αυτόν&lt;br&gt;&lt;br&gt;Η συνολικά δουλεύει σωστά. &lt;br&gt;Το πρόβλημα είναι όταν θέλω να τους σκοτώσω:&lt;br&gt;&lt;br&gt;&lt;table width="100%" border="0" cellpadding="0" cellspacing="0"&gt;&lt;tr style="vertical-align:top;line-height:normal;"&gt;&lt;td style="width:40px;text-align:right;"&gt;&lt;pre style="margin:0px;padding:2px;font-family:courier new;font-size:11px;color:gray;"&gt;1&lt;br&gt;2&lt;br&gt;3&lt;br&gt;4&lt;br&gt;5&lt;br&gt;6&lt;br&gt;7&lt;br&gt;8&lt;br&gt;9&lt;br&gt;10&lt;br&gt;11&lt;br&gt;12&lt;br&gt;13&lt;br&gt;14&lt;br&gt;15&lt;br&gt;16&lt;br&gt;17&lt;br&gt;18&lt;br&gt;19&lt;br&gt;20&lt;br&gt;21&lt;br&gt;22&lt;br&gt;23&lt;br&gt;24&lt;br&gt;25&lt;br&gt;26&lt;br&gt;27&lt;br&gt;28&lt;br&gt;29&lt;br&gt;30&lt;br&gt; &lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre style="margin:0px;padding:2px 2px 2px 8px;"&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;void&lt;/span&gt; Terminate()&lt;br&gt;        {&lt;br&gt;            &lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;//Σκότωσε τους Intermeditates σου&lt;/span&gt;&lt;br&gt;            &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;foreach&lt;/span&gt; (KeyValuePair&amp;lt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;string&lt;/span&gt;, Intermediate&amp;gt; interPair &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;in&lt;/span&gt; IntermediateList)&lt;br&gt;                interPair.Value.Terminate();&lt;br&gt;&lt;br&gt;            &lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;//Σκότωσε τους Sensors σου&lt;/span&gt;&lt;br&gt;            &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;foreach&lt;/span&gt; (KeyValuePair&amp;lt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;string&lt;/span&gt;, Sensor&amp;gt; sensorPair &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;in&lt;/span&gt; SensorList)&lt;br&gt;            {&lt;br&gt;                sensorPair.Value.Terminate();&lt;br&gt;            }&lt;br&gt;&lt;br&gt;            &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;while&lt;/span&gt; (&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;true&lt;/span&gt;)&lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;//Περιμένουμε μέχρι να πεθάνουν όλοι οι sensors&lt;/span&gt;&lt;br&gt;            {&lt;br&gt;                &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; liveCount &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 0;&lt;br&gt;                &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;for&lt;/span&gt; (&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; i &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; 0; i &amp;lt; SensorList.Values.Count; ++i)&lt;br&gt;                {&lt;br&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;                       if&lt;/span&gt; (SensorList.Values[ i ] .IsBusy)&lt;br&gt;                        ++liveCount;&lt;br&gt;                }&lt;br&gt;&lt;br&gt;                &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt; (liveCount == 0)&lt;br&gt;                    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;break&lt;/span&gt;;&lt;br&gt;                &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;else&lt;/span&gt;&lt;br&gt;                    Thread.Sleep(100);&lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;//Kοιμήσου λίγο και ξανάδοκίμασε&lt;/span&gt;&lt;br&gt;            }&lt;br&gt;&lt;br&gt;            SensorList.Clear();&lt;br&gt;            TerminateLoop &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;true&lt;/span&gt;;&lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;//Εδώ τελειώνει το loop του Intermediate&lt;/span&gt;&lt;br&gt;        }&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;Οι Sensor Και Intermediate κάνουν inherit την BackgroundWorker&lt;br&gt;H Terminate απλά κάνει true μια μεταβλητή και σπάει ένα while loop που τρέχει στη Work function του Sensor&lt;br&gt;&lt;br&gt;Στην Γραμμή 18 Δεν καταφέρνω ποτέ να πάρω False.&lt;br&gt;Στον debugger φαίνεται ποτέ να μην εκτελείται το event OnRunWorkerCompleted παρόλο που το event OnDoWork δείχνει να τερματίζει κανονικά.&lt;br&gt;Γιατί συμβαίνει αυτό.&lt;br&gt;Αν πάλι αφαιρέσω τον κώδικα όπου περιμένω να τερματίσουν οι BW, στο Performance monitor δεν φαίνεται να πεθαίνουν τα threads που δημιουργήθηκαν.&lt;br&gt;Παρόλο που σταματούν οι ενημερώσεις της ΒΔ.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description></item><item><title>Απ: SCLConnection Μέσα από Threads με το ίδιο SQLConnectionString</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/46974.aspx</link><pubDate>Thu, 18 Dec 2008 18:40:19 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:46974</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/46974.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=46974</wfw:commentRss><description>&lt;P&gt;Τα sleep δεν χρειάζονται ποτέ, εκτός και αν υπάρχει bug. Η CPU δεν τα χρειάζεται για να κάνει scheduling. Αν χρειάζεσαι sleep, μάλλον κάπου υπάρχει blocking μεταξύ διαφορετικών threads. Αν, για παράδειγμα, χρησιμοποιείς όπως είπες, ένα global dataset ή αν πειράζεις άλλα global αντικείμενα, όπως&amp;nbsp; τα DataGridViews, έχεις θέμα blocking. &lt;/P&gt;
&lt;P&gt;Διαβάζοντας την αρχική περιγραφή σου πάντως σκέφτομαι ότι μάλλον δεν χρειάζεσαι ούτε threads ούτε BackgroundWorker. Φαίνεται ότι αυτό που θέλεις να κάνεις είναι να διαβάσεις πληροφορίες από τρία διαφορετικά connections και να μαζέψεις τα αποτελέσματα σε ένα σημείο? Τότε δεν χρειάζεσαι το while loop. &lt;/P&gt;
&lt;P&gt;Μία προσέγγιση είναι ένα delegate ο οποίος θα ανοίγει ένα connection και θα αποθηκεύει τα αποτελέσματα σε ένα datatable. Μετά, τρέχεις 3 φορές με BeginInvoke το ίδιο delegate με διαφορετικές παραμέτρους. Τα αποτελέσματα μπορείς να τα πάρεις με 2 διαφορετικούς τρόπους. Μπορείς να περάσεις ένα callback method στους Delegates το οποίο θα πάρει τα αποτελέσματα και θα τα γράψει στο κεντρικό dataset, ή μπορείς να περιμένεις να τελειώσουν και τα 3 threads με την WaitHandle.WaitAll για να πάρεις τότε τα αποτελέσματα. Την WaitAll θα την χρειαστείς έτσι κι αλλιώς για να γεμίσεις τα datagridviews. Βέβαια, αν κάθε DataGridView δείχνει τα αποτελέσματα ενός και μόνo query, μπορείς να κάνεις όλη τη δουλειά στα callbacks και δεν χρειάζεσαι το global Dataset.&lt;/P&gt;
&lt;P&gt;Αν όμως χρησιμοποιείς SQL Server έχεις μία ακόμα καλύτερη δυνατότητα, να εκτελέσεις τα queries ασύγχρονα. Η SqlCommand έχει τις BeginExecuteReader, BeginExecuteScalar, BeginExecuteNonQuery οι οποίες εκτελούν και αυτές ασύγχρονα μία εντολή και επιστρέφουν τα αποτελέσμαστα στις αντίστοιχες EndXXX. Όπως και με τα delegates, μπορείς να περάσεις ένα callback το οποίο θα κάνει update τα DataGridViews στο τέλος ή να τις περιμένεις όλες με την WaitHandle.WaitAll. Το μόνο που πρέπει να προσέξεις είναι ότι δεν μπορείς να εκτελέσεις πολλά ασύγχρονα SqlCommands πάνω στο ίδιο connection. Κάθε SqlCommand θα χρειαστεί το δικό του SqlConnection. Για παραδείγματα με όλους τους τρόπους κλήσης, δες το &lt;A href="http://msdn.microsoft.com/en-us/library/zw97wx20(VS.80).aspx"&gt;Performing Asynchronous Operations&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Το καλό με την τελευταία λύση είναι ότι είναι απλούστερη από όλες τις άλλες, απαιτεί λιγότερο κώδικα, δεν μπλέκει threads και αφήνει το ADO.NET να διαχειριστεί την ασύγχρονη επικοινωνία με τον SQL Server. &lt;/P&gt;</description></item><item><title>Απ: SCLConnection Μέσα από Threads με το ίδιο SQLConnectionString</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/46973.aspx</link><pubDate>Thu, 18 Dec 2008 17:53:05 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:46973</guid><dc:creator>pontifikas</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/46973.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=46973</wfw:commentRss><description>Τελικά με background worker δούλεψε. Βέβαια, αναρωτιέμαι μήπως έφταιγαν τα while loops μου που δεν είχαν κάποιο sleep ώστε να επιτρέπει στην CPU να κάνει καλό scheduling. Και με background worker είχα κάποια προβλήματα αλλά μόλις έβαλα κάποια sleeps όλα δούλεψαν ρολόι. φαινομενικά τουλάχιστο.&lt;br&gt;Ευχαριστώ πολυ&lt;br&gt;&lt;br&gt;</description></item><item><title>Απ: SCLConnection Μέσα από Threads με το ίδιο SQLConnectionString</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/46761.aspx</link><pubDate>Mon, 08 Dec 2008 00:56:50 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:46761</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/46761.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=46761</wfw:commentRss><description>&lt;P&gt;Μήπως να δοκιμάσεις να παίξεις με BackgroundWorker; Ο προγραμματισμός απευθείας με threads είναι αρκετά δύσκολος, κυρίως λόγω αυτού που αναφέρεις, ότι μπορεί να μην είναι ίδια η συμπεριφορά του προγράμματος κατά το debugging. Αν κατάλαβα καλά το σενάριο, προσπαθείς να γεμίσεις κάποιους πίνακες ταυτόχρονα, πράγμα που προσφέρεται για BackgroundWorker.&lt;/P&gt;</description></item><item><title>SQLConnection Μέσα από Threads με το ίδιο SQLConnectionString</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/46752.aspx</link><pubDate>Sun, 07 Dec 2008 04:34:49 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:46752</guid><dc:creator>pontifikas</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/46752.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=46752</wfw:commentRss><description>Προσπαθώ να δημιουργήσω threads τα οποία θα είναι σε θέση να κάνουν εγγραφές σε μια ΒΔ. &lt;br&gt;Για αρχή δοκιμάζω το εξής απλό σενάριο:&lt;br&gt;Φτοιάχνω 3 threads, στην Start Function δημιουργώ και ανοίγω ένα connection, ρίχνω ένα select query, γράφω τα αποτελεματα σε ένα DataTable&lt;br&gt;και κάθε Thread γραφει το Table του σε ένα DataSet που είναι Global. Στην συνέχεια τα threads μπαίνουν σε ένα Loop (while(true)) στην Start Function τους &lt;br&gt;και περιμένουν το thread που τα έφτοιαξε να τους σπάσει το loop (κάνει false το while).&lt;br&gt;Μόλις τα Threads παιθάνουν το πρόγραμμα παίρνει τα Tables από το Dataset και τα ρίχνει σε 3 DataGridView Που έχω φτοιάξει για αυτό το σκοπό.&lt;br&gt;Και τα 3 SQLConnections τρέχουν το ίδιο ConnectionString που το έχω φτοιάξει για Windows Authentication.&lt;br&gt;&lt;br&gt;Όταν το παραπάνω το τρέχω σε Debug(F5), δείχνει να δουλεύει κανονικά.&lt;br&gt;Όταν το τρέχω σε Release(Ctrl-F5), με το που στέλνω την εντολή για να αρχίσουν να πεθαίνουν τα Threads (το κάνω με ένα button) το πρόγραμμα κολλάει.&lt;br&gt;Από τον Performance Monitor τα threads φαίνονται να μην έχουν πεθάνει&lt;br&gt;&lt;br&gt;Τρέχω Sql Server 2008 Express σε VS 2008 Express, και Vista.&lt;br&gt;&lt;br&gt;Καμοιά ιδέα? Ευχαριστώ&lt;br&gt;</description></item></channel></rss>