<?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>Γενικά Θέματα VS.NET</title><link>https://www.dotnetzone.gr:443/cs/forums/81/ShowForum.aspx</link><description>Γενική συζήτηση για το Visual Studio IDE, καθώς και ανταλλαγή tips και tricks για καθημερινή χρήση</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: Περισσότερες από μία φόρμες με κοινή εμφάνιση</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/77739.aspx</link><pubDate>Wed, 15 Jun 2016 19:20:03 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:77739</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/77739.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=81&amp;PostID=77739</wfw:commentRss><description>&lt;p&gt;Αν είχες ρωτήσει κατευθείαν "Θέλω να επεξεργαστώ πολλά εισερχόμενα e-mail" θα σου έλεγα απευθείας να χρησιμοποιήσεις ένα ActionBlock από το TPL Dataflow library. Δεν υπάρχουν πολλαπλά message loops σε μία Windows εφαρμογή, ούτε χρειάζονται για να επεξεργαστείς κάτι ασύγχρονα. Ακριβώς επειδή υπάρχει μόνο ένα Message loop, δεν μπορείς να πειράξεις και ένα UI control από διαφορετικά threads.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;span style="font-size:10pt;"&gt;Αντί γι αυτό, καλύτερα να χρησιμοποιήσεις ένα ActionBlock&amp;lt;T&amp;gt; το οποίο θα καλεί ένα function για να επεξεργαστεί κάθε μήνυμα. To ActionBlock κάνει buffer τα εισερχόμενα μηνύματα αν και μπορείς να ορίσεις όριο, για να μην μεγαλώσει υπερβολικά ο buffer αν είναι αργό το function. Επίσης μπορείς να ορίσεις ότι θα χρησιμοποιηθούν παραπάνω από ένα tasks για την επεξεργασία των μηνυμάτων, οπότε η επεξεργασία θα γίνει παράλληλα.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Ο κώδικας είναι πολύ απλός: &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp; &amp;nbsp; var myBlock = new ActionBlock&amp;lt;MyEmail&amp;gt;(it =&amp;gt; MyProcessingMethod(it) );&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;"&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp; &amp;nbsp; foreach (var email in myListOfEmails)&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;"&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp; &amp;nbsp; {&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; myBlock.Post(email);&amp;nbsp;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;"&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp; &amp;nbsp; }&lt;/font&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Όταν τελειώσει η επεξεργασία και θέλεις να κλείσεις το block, καλείς την Complete() και περιμένεις να τελειώσει το Completion task, το οποίο σημαίνει ότι καθάρισαν οι εκκρεμότητες:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &lt;font face="courier new,courier"&gt;&amp;nbsp; myBlock.Complete();&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp; await myBlock.Completion;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Το TPL Dataflow περιέχει και άλλα χρήσιμα blocks. Για παράδειγμα, το TransformBlock καλεί ένα function το οποίο λαμβάνει ένα input και επιστρέφει ένα διαφορετικό output. Αυτό σου επιτρέπει να σπάσεις τη διαδικασία της επεξεργασίας σε βήματα, όπως θα έκανες και στο command line και να περάσεις τα αποτελέσματα του ενός βήματος, στο επόμενο.&amp;nbsp;Κάθε βήμα εκτελείται με διαφορετικά tasks, οπότε έχεις άλλο ένα τρόπο να πετύχεις ασύγχρονη επεξεργασία. Πχ.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var myParser=new TransformBlock&amp;lt;MyEmail,MyCustomer&amp;gt;(x=&amp;gt;GetCustomerFromEmail(x));&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var&amp;nbsp;myBlock = new ActionBlock&amp;lt;MyCustomer&amp;gt;(x=&amp;gt;&amp;nbsp;DoSomethingWithCustomer(x));&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; myParser.LinkTo(myBlock,&amp;nbsp;new DataflowLinkOptions { PropagateCompletion = true });&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;....&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;myParser.Post(&amp;nbsp;email);&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp; ...&amp;nbsp;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp; myParser.Complete();&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp; await myBlock.Completion;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Εδώ το LinkTo μεταφέρει το αποτέλεσμα από το πρώτο βήμα στο επόμενο. Το PropagateCompletion σημαίνει ότι αν ολοκληρωθεί το προηγούμενο βήμα,&amp;nbsp;θα πρέπει να ολοκληρωθεί και το επόμενο. Μόλις τελειώσουν τα μηνύματα καλείται η Complete()&amp;nbsp;στο πρώτο βήμα και περιμένουμε&amp;nbsp;μέχρι να τελειώσει και το τελευταίο μήνυμα&amp;nbsp;&lt;/p&gt;</description></item><item><title>Απ: Περισσότερες από μία φόρμες με κοινή εμφάνιση</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/77738.aspx</link><pubDate>Wed, 15 Jun 2016 19:08:07 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:77738</guid><dc:creator>xrousaios</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/77738.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=81&amp;PostID=77738</wfw:commentRss><description>&lt;p&gt;Τελικά το έλυσα χρησιμοποιώντας ένα Thread pool στο οποίο στέλνω μία structure με πληροφορίες γιά κάθε εισερχόμενο e-mail. Η Thread pool εκκινεί μία διαδικασία η οποία κάνει όλα τα υπόλοιπα.&lt;/p&gt;&lt;p&gt;Πρός ώρας, δείχνει να λειτουργεί σωστά...&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description></item><item><title>Περισσότερες από μία φόρμες με κοινή εμφάνιση</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/77736.aspx</link><pubDate>Thu, 09 Jun 2016 20:37:39 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:77736</guid><dc:creator>xrousaios</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/77736.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=81&amp;PostID=77736</wfw:commentRss><description>&lt;p&gt;Καλημέρα,&lt;/p&gt;&lt;p&gt;Θα ήθελα να εκθέσω το ακόλουθο πρόβλημα σχεδιασμού που έχω, στο Visual Studio με Visual Basic.&lt;br&gt;Η εφαρμογή μου αποτελείται από μερικές φόρμες και μία βάση δεδομένων (Microsoft Access).&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10pt;"&gt;Μία από τις φόρμες, συνδέεται με το Microsoft Outlook. Μέσα σε αυτήν την φόρμα, διαχειρίζομαι δύο events :&lt;br&gt;- Το event της &amp;nbsp;άφιξης ενός e-mail στο Outlook. Γιά κάθε e-mail που έρχεται, εκκινεί μία διαδικασία επεξεργασίας του, μέσω της οποίας καταχωρώ κάποια στοιχεία του στην βάση δεδομένων και, εμφανίζω το θέμα του στην οθόνη του χρήστη. &amp;nbsp; &amp;nbsp;&lt;br&gt;- To event ενός timer, ο οποίος εκκινεί κάθε χχ λεπτά. Κάθε φορά που ξεκινάει ο timer, διαβάζω τα αφιχθέντα e-mails μέχρι εκείνη την στιγμή, &amp;nbsp;πραγματοποιώ κάποια επεξεργασία και εμφανίζω κάποιες πληροφορίες στην ίδια οθόνη.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Το πρόβλημα είναι ότι, αρκετά συχνά, συμβαίνει να επικαλύπτεται η λειτουργία των δύο events και το πρόγραμμα, μετά από αυτό, χάνει την επαφή του με το outlook.&lt;/p&gt;&lt;p&gt;Από την περιγραφή, φαίνεται ότι και τα δύο events, λειτουργούν κάτω από το ίδιο main-message loop.&lt;br&gt;Σκέφτομαι ότι, ένας ριζικός τρόπος λύσης του προβλήματος είναι να διαχωρίσω τις δύο διεργασίες σε δύο διαφορετικές φόρμες και κάθε μία να τρέχει σε διαφορετικό main-message loop (Π.χ. και οι δύο φόρμες να εκκινούν μέσω μίας άλλης κύριας φόρμας, σε διαφορετικό thread η κάθε μία) .&lt;/p&gt;&lt;p&gt;Το κυριώτερο πρόβλημα σε αυτή την προσέγγιση είναι ότι, οι δύο φόρμες γίνονται ανεξάρτητες και ο χρήστης μπορεί να τις κουνήσει όπου θέλει και, γενικώς να κάνει ό,τι θέλει. Συνεπώς,&amp;nbsp;&lt;span style="font-size:13.3333px;"&gt;χάνω την ενιαία διαχείριση της διαδικασίας.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:13.3333px;"&gt;&lt;/span&gt;&lt;span style="font-size:13.3333px;"&gt;ΑΝ πάλι χρησιμοποιήσω MDI, καταλήγω και πάλι να λειτουργούν και οι δύο φόρμες κάτω από το ίδιο main-message loop της MDI, οπότε, η μία φόρμα περιμένει να τελειώσει η εργασία της άλλης φόρμας και το ανάποδο. Όπερ άτοπον. &amp;nbsp;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;Κάπου εδώ, μάλλον έχω χάσει την μπάλα....&lt;/p&gt;&lt;p&gt;Κάθε ιδέα επί του θέματος, θα μου είναι ιδιαίτερα χρήσιμη&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Ευχαριστώ εν των προτέρων γιά κάθε βοήθεια.&lt;/p&gt;&lt;p&gt;Γιώργος&amp;nbsp;&lt;/p&gt;</description></item></channel></rss>