Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 18870|Απάντηση: 1

[Πηγή] Εφαρμογή C# τριών χρονόμετρων

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 12/10/2017 1:12:51 μ.μ. | | |
Σχετικά με την κατηγορία χρονοδιακόπτη στη C# Υπάρχουν τρεις κατηγορίες χρονοδιακόπτη στη C#

1. Ορίστε στο System.Windows.Forms

2. Ορίζεται στην κλάση System.Threading.Timer

3. Ορίζεται στην κλάση System.Timers.Timer



Το System.Windows.Forms.Timer εφαρμόζεται στο WinForm, υλοποιείται μέσω του μηχανισμού μηνυμάτων των Windows, παρόμοιο με το στοιχείο ελέγχου Timer στο VB ή στο Delphi, και υλοποιείται εσωτερικά χρησιμοποιώντας το API SetTimer. Το κύριο μειονέκτημά του είναι ότι ο χρονισμός δεν είναι ακριβής και πρέπει να υπάρχει βρόχος μηνυμάτων, ο οποίος δεν είναι διαθέσιμος στην Εφαρμογή Κονσόλας.



Το System.Timers.Timer μοιάζει πολύ με το System.Threading.Timer, υλοποιούνται μέσω .NET Thread Pool, ελαφρού, ακριβούς χρονισμού και χωρίς ειδικές απαιτήσεις για εφαρμογές και μηνύματα. Το System.Timers.Timer μπορεί επίσης να εφαρμοστεί στο WinForm, αντικαθιστώντας πλήρως τον παραπάνω έλεγχο Timer. Το μειονέκτημά τους είναι ότι δεν υποστηρίζουν άμεση μεταφορά και απόθεση και απαιτούν χειροκίνητη κωδικοποίηση.



Παράδειγμα:

Χρησιμοποιήστε την κλάση System.Timers.Timer

System.Timers.Timer t = νέο System.Timers.Timer(10000); Δημιουργήστε την κλάση Timer και ορίστε το διάστημα στα 10.000 χιλιοστά του δευτερολέπτου.

t.Elapsed += new System.Timers.ElapsedEventHandler(theout); Εκτελέστε συμβάντα όταν φτάσει η ώρα.

t.AutoReset = αληθές; Ορίστε εάν θα εκτελείται μία φορά (ψευδές) ή όλη την ώρα (αληθές).

t.Enabled = αληθές; εάν θα εκτελεστεί το συμβάν System.Timers.Timer.Elapsed.



public void theout(object source, System.Timers.ElapsedEventArgs e)

{

MessageBox.Show("ΟΚ!");

}



Πειραματική ανάλυση των ομοιοτήτων και των διαφορών μεταξύ της χρήσης τριών χρονόμετρων στη C#

http://dotnet.chinaitlab.com/CSharp/737740.html



Υπάρχουν τρεις τύποι χρονόμετρων που διατίθενται σε C#:


1. Τυπικό χρονόμετρο που βασίζεται σε Windows (System.Windows.Forms.Timer)


2. Χρονόμετρο που βασίζεται σε διακομιστή (System.Timers.Timer)


3. Χρονοδιακόπτης σπειρώματος (System.Threading.Timer)

Ας περάσουμε από μερικά μικρά πειράματα για να αναλύσουμε τις ομοιότητες και τις διαφορές μεταξύ των τριών χρονόμετρων, ειδικά του τμήματος που σχετίζεται με το νήμα.

Στιγμιότυπο οθόνης πειραματικού παραδείγματος:



1. Τυπικό χρονόμετρο που βασίζεται σε Windows (System.Windows.Forms.Timer)



Το πρώτο πράγμα που πρέπει να σημειωθεί είναι ότι το Windows Timer έχει σχεδιαστεί για περιβάλλοντα ενός νήματος



Αυτό το χρονόμετρο υπάρχει στο προϊόν από την έκδοση 1.0 της Visual Basic και έχει παραμείνει σε μεγάλο βαθμό αμετάβλητο



Αυτό το χρονόμετρο είναι το πιο εύκολο στη χρήση, απλώς σύρετε το στοιχείο ελέγχου Χρονόμετρο από την εργαλειοθήκη στη φόρμα και ορίστε τις ιδιότητες όπως συμβάντα και διαστήματα



Τα πειραματικά αποτελέσματα είναι επίσης πλήρως συνεπή με τα χαρακτηριστικά του απλού σπειρώματος:



1. Όταν ξεκινήσει αυτό το χρονόμετρο, το αναγνωριστικό του θυγατρικού νήματος θα εμφανιστεί στη λίστα αναγνωριστικών του θυγατρικού νήματος παρακάτω και είναι το ίδιο με το αναγνωριστικό του κύριου νήματος



private void formsTimer_Tick(αποστολέας αντικειμένου, EventArgs e)



{



i++;



lblSubThread.Text += "Εκτέλεση υπονήματος, αναγνωριστικό νήματος:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";



}









2. Όταν το κύριο νήμα τεθεί σε παύση για 5 δευτερόλεπτα, το θυγατρικό νήμα θα διακόψει την εκτέλεση και όταν το θυγατρικό νήμα που είχε ανασταλεί προηγουμένως δεν εκτελεστεί μετά από 5 δευτερόλεπτα, το επόμενο θυγατρικό νήμα θα εκτελεστεί απευθείας (δηλαδή, θα εξάγει μερικές γραμμές τιμών).



Σύστημα.Σπείρωμα.Νήμα.Ύπνος(5000);



3. Η παύση των συμβάντων μιας θυγατρικής διεργασίας για 5 δευτερόλεπτα θα προκαλέσει τη διακοπή της απόκρισης του κύριου παραθύρου για 5 δευτερόλεπτα



4. Ορίστε μια στατική μεταβλητή νήματος:



[Στατικό νήμα]



ιδιωτικός στατικός ακέραιος i = 0;



Προσθέστε ένα σε κάθε συμβάν υπονήματος και, στη συνέχεια, κάντε κλικ στην τιμή της στατικής μεταβλητής νήματος για να λάβετε την αυξημένη τιμή i



2. Χρονόμετρο που βασίζεται σε διακομιστή (System.Timers.Timer)



Το System.Timers.Timer δεν εξαρτάται από φόρμες, αφυπνίζει νήματα από το χώρο συγκέντρωσης νημάτων και είναι μια ενημερωμένη έκδοση του παραδοσιακού χρονοδιακόπτη που έχει βελτιστοποιηθεί για εκτέλεση σε περιβάλλον διακομιστή



Δεν παρέχονται έτοιμα στοιχεία ελέγχου στην εργαλειοθήκη VS2005 και πρέπει να κωδικοποιηθούν χειροκίνητα για να χρησιμοποιήσετε αυτό το χρονόμετρο



Υπάρχουν δύο τρόποι για να το χρησιμοποιήσετε,



1. Επισυνάψτε στη φόρμα μέσω της ιδιότητας SynchronizingObject



System.Timers.Timer timersTimer = νέο System.Timers.Timer();



timersTimer.Enabled = false;



timersTimer.Interval = 100;



timersTimer.Elapsed += νέο System.Timers.ElapsedEventHandler(timersTimer_Elapsed);



timersTimer.SynchronizingObject = αυτό;



Με αυτόν τον τρόπο, το πείραμα λειτουργεί σχεδόν το ίδιο με ένα τυπικό χρονόμετρο που βασίζεται σε Windows, εκτός από το ότι στο δεύτερο πείραμα παραπάνω, αν και η εκτέλεση του υπονήματος θα τεθεί επίσης σε παύση, αλλά μετά από 5 δευτερόλεπτα θα εκτελεστούν όλες οι εργασίες που είχαν προηγουμένως τεθεί στην ουρά (δηλαδή δεν θα λείπουν μερικές γραμμές τιμής).



2. Μην χρησιμοποιείτε την ιδιότητα SynchronizingObject



Αυτή η μέθοδος είναι πολλαπλών νημάτων, δηλαδή το αρχικό θυγατρικό νήμα και η κύρια φόρμα δεν βρίσκονται στο ίδιο νήμα. Ωστόσο, υπάρχει επίσης ένα πρόβλημα: δεδομένου ότι το δευτερεύον νήμα είναι ένα ξεχωριστό νήμα, δεν είναι δυνατή η πρόσβαση στα στοιχεία ελέγχου της φόρμας, αλλά είναι δυνατή η πρόσβαση μόνο μέσω διακομιστή μεσολάβησης:



delegate void SetTextCallback(κείμενο συμβολοσειράς);



Πηγή: (http://blog.sina.com.cn/s/blog_5aeeb8200100bhc4.html) - (Turn) Σύγκριση τριών αντικειμένων χρονοδιακόπτη στο ιστολόγιο C#_dash_Sina









void timersTimer_Elapsed(αποστολέας αντικειμένου, System.Timers.ElapsedEventArgs e)



{



//使用代理



string text = "εκτέλεση θυγατρικού νήματος, αναγνωριστικό νήματος:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";



SetTextCallback d = νέο SetTextCallback(SetText);



αυτό. Invoke(d, νέο αντικείμενο[] { text });



i++;



}



ιδιωτικό κενό SetText(κείμενο συμβολοσειράς)



{



lblSubThread.Text += κείμενο;



}



Με αυτόν τον τρόπο, θα λάβουμε ξανά τα ακόλουθα αποτελέσματα από το πείραμα:



1. Όταν ξεκινήσει αυτό το χρονόμετρο, το αναγνωριστικό του θυγατρικού νήματος θα εμφανιστεί στη λίστα αναγνωριστικών του θυγατρικού νήματος παρακάτω και είναι διαφορετικό από το αναγνωριστικό του κύριου νήματος







2. Όταν κάνετε κλικ στο κύριο νήμα για παύση για 5 δευτερόλεπτα, το δευτερεύον νήμα θα συνεχίσει να εκτελείται (μπορεί να μην είναι ορατό στη διεπαφή, αλλά μπορεί να φανεί εύκολα με την έξοδο του αρχείου στο δευτερεύον νήμα)



3. Η παύση των συμβάντων μιας θυγατρικής διεργασίας για 5 δευτερόλεπτα δεν θα προκαλέσει τη διακοπή της απόκρισης του κύριου παραθύρου



4. Προσθέστε ένα στη στατική μεταβλητή νήματος κάθε φορά στο συμβάν υπο-νήματος και, στη συνέχεια, κάντε κλικ στο εάν η στατική μεταβλητή νήματος αξίζει 0 ή 0 (δεν θα αλλάξει τη στατική μεταβλητή νήματος στο κύριο παράθυρο).



3. Χρονοδιακόπτης σπειρώματος (System.Threading.Timer)



Τα χρονόμετρα νημάτων επίσης δεν βασίζονται σε φόρμες, είναι απλά, ελαφριά χρονόμετρα που χρησιμοποιούν μεθόδους επανάκλησης αντί να χρησιμοποιούν συμβάντα και τροφοδοτούνται από νήματα συγκέντρωσης νημάτων.



Τα χρονόμετρα νημάτων είναι χρήσιμα σε σενάρια όπου τα μηνύματα δεν αποστέλλονται σε νήματα.



Δείτε πώς να το χρησιμοποιήσετε:



System.Threading.Timer threadTimer;



public void ThreadMethod(Κατάσταση αντικειμένου)



{



//使用代理



string text = "εκτέλεση θυγατρικού νήματος, αναγνωριστικό νήματος:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";



SetTextCallback d = νέο SetTextCallback(SetText);



αυτό. Invoke(d, νέο αντικείμενο[] { text });



i++;



}



ιδιωτικό κενό Form1_Load(αποστολέας αντικειμένου, EventArgs e)



{



threadTimer = νέο System.Threading.Timer(νέο System.Threading.TimerCallback(ThreadMethod), null, -1, -1);



}



Κωδικός παύσης:



threadTimer.Change(-1, -1);



Το αποτέλεσμα του πειράματος είναι το ίδιο με τον δεύτερο τρόπο του χρονοδιακόπτη που βασίζεται σε διακομιστή (System.Timers.Timer),



Φυσικά, οι συγκεκριμένες μέθοδοι και αρχές χρήσης είναι διαφορετικές, το πιο σημαντικό είναι ότι αυτή η μέθοδος χρησιμοποιεί τη μέθοδο πράκτορα αντί για τη μέθοδο συμβάντος και μπορεί να εκτελεστεί ξεχωριστά χωρίς να βασίζεται σε φόρμες και στοιχεία



Ακολουθεί ένας πίνακας που συνοψίζεται από αλλοδαπούς (η διαφορά μεταξύ των τριών μεθόδων):



Feature descrip{filter}tion System.Timers.Timer System.Threading.Timer System.Windows.Forms.Timer



Υποστήριξη για προσθήκη και αφαίρεση ακροατών μετά τη δημιουργία του χρονοδιακόπτη. Ναι Όχι Ναι



Υποστηρίζει επιστροφές κλήσεων στο νήμα διεπαφής χρήστη Ναι Όχι Ναι



Κλήσεις από νήματα που λαμβάνονται από τη δεξαμενή νημάτων Ναι Ναι Όχι



Υποστηρίζει μεταφορά και απόθεση στο Windows Forms Designer Ναι Όχι Ναι



Κατάλληλο για εκτέλεση σε περιβάλλον πολλαπλών νημάτων διακομιστή Ναι Ναι Όχι



Περιλαμβάνει υποστήριξη για τη μεταβίβαση αυθαίρετης κατάστασης από την προετοιμασία του χρονομέτρου στην επιστροφή κλήσης. Όχι Ναι Όχι



Υλοποιεί IDΔιαθέσιο Ναι Ναι Ναι



Υποστηρίζει εφάπαξ επανακλήσεις καθώς και περιοδικές επαναλαμβανόμενες επανακλήσεις Ναι Ναι Ναι



Προσβάσιμο πέρα από τα όρια του τομέα της εφαρμογής Ναι Ναι Ναι



Υποστηρίζει IConponent – με δυνατότητα φιλοξενίας σε IContainer Ναι Όχι Ναι




Προηγούμενος:c# Η έκφραση Lamda ορίζει την αποομαδοποίηση για να λάβει την ελάχιστη τιμή
Επόμενος:Linq: Μην χρησιμοποιείτε ποτέ το Count() > 0 για να προσδιορίσετε ότι το σύνολο δεν είναι κενό
Δημοσιεύτηκε στις 8/11/2017 2:02:44 μ.μ. |
Είναι αλήθεια. Είναι πολύ καλό, αλλά γιατί δεν απάντησες στην ανάρτηση;
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com