Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Πως περνάμε parameters σε μια Windows Service

Îåêßíçóå áðü ôï ìÝëïò dtakis. Τελευταία δημοσίευση από το μέλος agrammenos στις 05-02-2007, 17:25. Υπάρχουν 15 απαντήσεις.
Σελίδα 1 από 2 (16 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  05-02-2007, 10:16 24510

    Πως περνάμε parameters σε μια Windows Service

    Καλημέρα,

    Φτιάχνω ένα windows service το οποίο θέλω να δέχεται από τις ιδιότητες του Service και συγκεκριμένα το πεδίο Start Parameters ώστε να αλλάζει την περίοδο επαναλήψεως της λειτουργίας του σε δευτερόλεπτα:

    Έχω

     

    private void InitializeComponent()
      {
       this.timer1 = new System.Timers.Timer();
       ((System.ComponentModel.ISupportInitialize)(this.timer1)).BeginInit();
       //
       // timer1
       //
       this.timer1.Elapsed += new System.Timers.ElapsedEventHandler(Timer_Elapsed);
       this.timer1.Enabled = true;
       this.timer1.Interval = 3000;
       //
       // Service1
       //
       this.ServiceName = "Service1";
       ((System.ComponentModel.ISupportInitialize)(this.timer1)).EndInit();

      }

     

    και θέλω να αλλάξω το this.timer1.Interval με την τιμή που θα μου δίνει ο χρήστης όταν ξεκινάει το service.

    Από όσα forum έχω διαβάσει μέχρι τώρα καταλαβαίνω ότι μάλλον πρέπει να υπερφορτώσω την OnStart ώστε να δεχθεί το argument της παραμέτρου

    Η δικιά μου είναι η εξής απλή:

     

    protected override void OnStart(string[] args)
      {
       // TODO: Add code here to start your service.
       timer1.Enabled = true;
      }

    Τι πιστεύετε ότι πρέπει να κάνω;

    Επίσης ποιος είναι ο τρόπος να περνάμε παραμέτρους; Γράφουμε π.χ. στο Start Parameters: 30 (ότι θέλουμε να περάσουμε ανά 30 sec επανάληψη)

    Και αν θέλουμε να περάσουμε πολλές παραμέτρους τις περνάμε με κενά;

    Ευχαριστώ εκ των προτέρων 

    Δημοσίευση στην κατηγορία: , ,
  •  05-02-2007, 10:23 24512 σε απάντηση της 24510

    Απ:Πως περνάμε parameters σε μια Windows Service

    Τρεις τρόπους μου έρχονται στο μυαλό για να περάσεις παραμέτρους σε ένα windows service:

    1. Μέσω του OnStart, όπως γράφεις κι εσύ (ναι, έτσι λειτουργεί όπως το περιγράφεις)
    2. Με .NET Remoting, για real time τροποποίηση παραμέτρων (απλά το αναφέρω. Δεν κάνει για την περίπτωσή σου)
    3. Μέσω του app.config, το οποίο και προτείνω γι αυτό που θέλεις να κάνεις.

    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  05-02-2007, 10:37 24515 σε απάντηση της 24512

    Απ:Πως περνάμε parameters σε μια Windows Service

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

    Για την 3. Το app.config είναι ένα αρχείο που θα πρέπει να κάνει edit ο χρήστης για να αλλάξει την παράμετρο που θέλει ο χρήστης έτσι;

    Μπορείς να μου δώσεις έναν τρόπο να διαβάσω τα arguments για το 1 γιατί δεν είμαι σίγουρος; Επίσης πως θα περάσω default τιμή; Αν κάνω έλεγχο αν το timeInterval είναι μεγαλύτερο του 0 να περνάει default τιμή 3 (επί 1000 msec για να είμαστε πάντα σωστοί) ή χρειάζεται try catch αυτή η περίπτωση;

     

    protected override void OnStart(string[] args)
      {
       int timeInterval;
       // TODO: Add code here to start your service.
       timer1.Enabled = true;
       timeInterval = args(0).ToInteger();
      }

    Δοκίμασα το παραπάνω και στο build μου αναφέρει ότι The name 'args' does not exist in the class or namespace. Τι πρέπει να κάνω για αυτό;

    Any help welcomed!!!

    Δημοσίευση στην κατηγορία: , ,
  •  05-02-2007, 10:42 24516 σε απάντηση της 24515

    Απ:Πως περνάμε parameters σε μια Windows Service

    Μήπως το παραπάνω πρόβλημα είναι επειδή μάλλον το έγραψα όπως είδα σε tutorial ότι χρησιμοποιούν τα args στην VB;

    Δοκίμασα timeInterval = Convert.ToInt32(args[0]);

    και το build παίζει κανονικά!

  •  05-02-2007, 10:51 24517 σε απάντηση της 24516

    Απ:Πως περνάμε parameters σε μια Windows Service

    Αν θέλεις οπωσδήποτε arguments θα το έκανα έτσι (περίπου δηλαδή όπως το κάνεις κι εσύ):

                int timeInterval;
                try
                {
                    timeInterval = Convert.ToInt32(args[0]);
                }
                catch (Exception ex)
                {
                    timeInterval = 100; // default value
                    throw;
                }

    Επιμένω όμως να το κάνεις με app.config. Είναι ο προτεινόμενος τρόπος να δουλεύεις στο .net. Ναι, είναι αρχείο που πρέπει να επεξεργαστεί ο χρήστης. Ο κώδικας που θα γράψεις είναι ο εξής (σε vs 2005 και .net 2):

        int timeinterval = Properties.Settings.Default.timeInterval;

    και θα πρέπει να δημιουργήσεις το timeInterval setting ανοίγοντας τα properties του project σου και πηγαίνοντας στο Settings tab. 


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  05-02-2007, 11:10 24518 σε απάντηση της 24517

    Απ:Πως περνάμε parameters σε μια Windows Service

    Ευχαριστώ πολυ για την απάντησή σου,

    είχα γράψει κάτι παρόμοιο χωρίς try catch

    if(args[0].Length==0)
       {
        timeInterval = 3000;
       }
       else
       {
        timeInterval = Convert.ToInt32(args[0]);
        //timeInterval = args(0).ToInteger();//Problematic declaration
        timeInterval=timeInterval*1000;
       }

    αλλά παρόλο που δεν πέρναγα ως παράμετρο κάτι το service τερμάτιζε αμέσως βγάζοντας το μήνυμα: The Test service on Local Computer started and then stopped.  Some services stop automatically if they have no work to do, for example, the Performance Logs and Alerts service.

    Δηλαδή δεν μπήκε ποτέ στο βρόγχο για να πάρει την τιμή 3000, το ίδιο έγινε και όταν έβαλα έλεγχο timeInterval>0 και με τον δικό σου κώδικα.

    Με το Convert τιμή βγαίνει αν δεν έχουμε περάσει τίποτα; Το arg δεν θα είναι null ; Απορώ πως κολλήσαμε εδώ!

  •  05-02-2007, 11:21 24519 σε απάντηση της 24518

    Απ:Πως περνάμε parameters σε μια Windows Service

    Καταρχήν το if δεν λέγεται βρόγχος. Βρόγχοι είναι τα for/next foreach, do κλπ. Αυτό γιατί κατά τα άλλα βλέπω ότι προσέχεις πως εκφράζεσαι. Αλλιώς δεν θα το ανέφερα καθόλου! Smile

    Χρειάζεσαι ένα μηχανισμό logging για ένα σωστό windows service, έτσι ώστε να καταγράφονται τα σφάλματα που συμβαίνουν. Πρόκειται για unattended process και επειδή δεν μπορείς να εμφανίζεις μηνύματα σε κάποιο χρήστη, πρέπει να τα καταγράφεις σε κάποιο σημείο. Ψάξε για .net event log και θα βρεις παραδείγματα.

    Το σφάλμα που έβγαινε όταν δεν έβαζες κανένα argument ήταν μάλλον γιατί το args[0] δεν υπήρχε, δηλαδή args.Length=0. Οπότε ο σωστός έλεγχος στο if που γράφεις είναι if (args.Length==0)

    Σημείωση!!! Σταματώ να επιμένω στο app.config, αφού επιμένεις εσύ στο args! Wink


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  05-02-2007, 11:30 24520 σε απάντηση της 24519

    Απ:Πως περνάμε parameters σε μια Windows Service

    Dimitris Papadimitriou:

    Καταρχήν το if δεν λέγεται βρόγχος. Βρόγχοι είναι τα for/next foreach, do κλπ. Αυτό γιατί κατά τα άλλα βλέπω ότι προσέχεις πως εκφράζεσαι. Αλλιώς δεν θα το ανέφερα καθόλου! Smile

    Αφού πιάσαμε το γλωσσικό, τα for, while κλπ είναι βρόχοι. Βρόγχος είναι αυτό που βάζεις γύρω από το λαιμό σου όταν θέλεις να κρεμαστείς Stick out tongue


    Νατάσα Μανουσοπούλου
  •  05-02-2007, 11:35 24522 σε απάντηση της 24520

    Απ:Πως περνάμε parameters σε μια Windows Service

    Νατάσα Μανουσοπούλου:
    Dimitris Papadimitriou:

    Καταρχήν το if δεν λέγεται βρόγχος. Βρόγχοι είναι τα for/next foreach, do κλπ. Αυτό γιατί κατά τα άλλα βλέπω ότι προσέχεις πως εκφράζεσαι. Αλλιώς δεν θα το ανέφερα καθόλου! Smile

    Αφού πιάσαμε το γλωσσικό, τα for, while κλπ είναι βρόχοι. Βρόγχος είναι αυτό που βάζεις γύρω από το λαιμό σου όταν θέλεις να κρεμαστείς Stick out tongue

    Embarrassed 


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  05-02-2007, 11:36 24523 σε απάντηση της 24519

    Απ:Πως περνάμε parameters σε μια Windows Service

    Ευχαριστώ για την παρατήρησή σου (τα λάθη πρέπει να διορθώνονται ακόμα και αν είναι εκ παραδρομής). Δεν σου ανέφερα ότι δουλεύω αναγκαστικά σε 1.1 & VS2003.

    Και εγώ αυτό υπέθεσα και έγραψα αυτό που μου προτείνεις τώρα

    if(args.Length==0)
          {
            timeInterval = 3000;

          }
          else
          {
            try
            {
              timeInterval = Convert.ToInt32(args[0])*1000;
            }
            catch (Exception ex)
            {
              timeInterval = 3000; // default value
              throw;
            }
            
          }
          
          
          timer1.Interval=timeInterval;

    Τώρα με το app.config θεωρώ ότι είναι σωστή προσέγγιση όπως και το web.config για net αλλά στην προκειμένη ο χρήστης είναι power user και ο θα κάνει κατά βούληση start & restart οπότε τον βολεύει να αλλάζει μόνο αυτή την παράμετρο από το Start Parameters και είναι κάτι σαν παγιωμένη προδιαγραφή. Τώρα αν μου ζητήσει και άλλες παραμέτρους (δηλαδή ξεπαγώσουν οι προδιαγραφές) θα το γυρίσω σε app.config. Ελπίζω μόνο να υπάρχει σε VS 2003 αυτή η δυνατότητα!

    Χίλια Ευχαριστώ για την βοήθειά σου.

  •  05-02-2007, 11:38 24524 σε απάντηση της 24520

    Απ:Πως περνάμε parameters σε μια Windows Service

    Νατάσα Μανουσοπούλου:
    Dimitris Papadimitriou:

    Καταρχήν το if δεν λέγεται βρόγχος. Βρόγχοι είναι τα for/next foreach, do κλπ. Αυτό γιατί κατά τα άλλα βλέπω ότι προσέχεις πως εκφράζεσαι. Αλλιώς δεν θα το ανέφερα καθόλου! Smile

    Αφού πιάσαμε το γλωσσικό, τα for, while κλπ είναι βρόχοι. Βρόγχος είναι αυτό που βάζεις γύρω από το λαιμό σου όταν θέλεις να κρεμαστείς Stick out tongue

    Και εγώ το ίδιο: Embarrassed

  •  05-02-2007, 12:14 24526 σε απάντηση της 24524

    Απ:Πως περνάμε parameters σε μια Windows Service

    Να σας πω κι εγώ την εμπειρία μου, καθότι τον τελευταίο καιρό δουλεύω συνέχεια με services. Καταρχήν, αν περάσεις τις παραμέτρους σαν arguments θα πρέπει να κάνεις προσεκτικό parsing για να πιάσεις τυχόν λάθη του χρήστη. Καθώς τα services δεν μπορούν να εμφανίσουν μηνύματα λάθους, τα μηνύματα θα πρέπει να τα γράψεις στο event log για να τα δει και ο χρήστης. Χρησιμοποιώντας το app.config μειώνονται αρκετά οι πιθανότητες να κάνει λάθος ο χρήστης αν και θέλει λίγο παραπάνω φασαρία για να βρει το αρχείο και να το κάνει edit.

    Γενικά πάντως, δεν έχει πλάκα να βάζεις settings είτε σαν arguments είτε στο app.config! Λάθη θα γίνουν και στις δύο περιπτώσεις, ενώ ο χρήστης που δεν έχει μεγάλη ιδέα από το service σου και τις παραμέτρους που έχεις ορίσει, θα δυσκολεύεται να κάνει αλλαγές. Το καλύτερο θα είναι κάπου να φτιάξεις ένα UI για να θέτεις τις παραμέτρους, είτε σαν ανεξάρτητο utility, είτε ενσωματώνοντας το στην εφαρμογή σου. Θέλει λίγη δουλειά παραπάνω, αλλά θα γλυτώσεις αρκετή γκρίνια και ψάξιμο του τί συνέβει και δεν δουλεύει το service!

    Όσον αφορά το logging τώρα, μπορείς να χρησιμοποιήσεις τους ενσωματωμένους Trace Listeners για να γράψεις ταυτόχρονα στο event log, σε log αρχεία ή αλλού. Γενικά, την χρειάζεσαι αυτή τη δυνατότητα, καθώς στα αρχεία μπορείς να γράψεις πολύ περισσότερα στοιχεία απ' ότι στο event log. Αν γράψεις π.χ. ένα ολόκληρο exception message στο event log, μαζί με το call stack του, ο χρήστης θα τρομάξει. Άσε που περιοδικά μπορεί να σβήνει το event log και να χάσεις έτσι χρήσιμα μηνύματα.

    Εδώ είναι που έχω βρει το Enterprise Library σωτήριο, καθώς μου επιτρέπει να ορίζω το που θα αποθηκευθεί ποιό μήνυμα από το app.config αντί για τον κώδικα μου. Γλύτωσα πολύ, μα πάρα πολύ επαναλαμβανόμενο κώδικα με αυτό τον τρόπο, απλά χρησιμοποιώντας τα Exception και Logging Application Blocks του Enterprise Library. Χρησιμοποιώ .NET 2.0 και το αντίστοιχο Enterprise Library το οποίο μου δίνει event log, flat file, database, email και MSMQ listeners, οι οποίοι μου φάνηκαν όλοι χρήσιμοι σε διάφορες φάσεις. Π.χ. ο email listener θα στείλει ένα κρίσιμο μήνυμα στον admin ότι έπεσε π.χ. το service. Επειδή όμως η διαδικασία αποστολής ενός email μπορεί να πάρει πάνω από 10 sec, χρησιμοποιώ τον MSMQ listener για να στείλω το email ασύγχρονα. Και το ωραίο είναι, ότι όλα αυτά στήνονται χωρίς εγώ να γράψω παρά μία εντολή Logger.Write! Όλα τα άλλα τα ορίζω στο app.config!

    Ένα πολύ σημαντικό σημείο τέλος έχει να κάνει με τα μηνύματα που γράφεις στα Log. Πρέπει να ξεχωρίσεις μεταξύ των exceptions και των admin μηνυμάτων. Ο χρήστης του service σου δεν θα καταλάβει τί σημαίνει ένα exception message. Θα πρέπει να στείλεις μηνύματα τα οποία καταλαβαίνει αυτός, τα οποία θα έχουν νόημα για τη δουλειά του. Π.χ. "το service ξεκίνησε", "το service σταματάει λόγω λάθους", "εκτελέστηκε η συναλλαγή χψω", ή "Η συναλλαγή χψω απέτυχε λόγω υπέρβασης ορίου". Είναι επίσης σημαντικό να γράφεις μηνύματα για τη δραστηριότητα του service, π.χ. "παρελήφθει νέα συναλλαγή", "η συναλλαγή ολοκληρώθηκε". Ο λόγος είναι ότι αν πάει κάτι στραβά, αυτά τα μηνύματα είναι τα μόνα που θα έχει στη διάθεση του ο χρήστης για να καταλάβει ότι κάτι πήγε λάθος και να το διορθώσει, ή να σε καλέσει να το διορθώσεις.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  05-02-2007, 12:45 24532 σε απάντηση της 24526

    Απ:Πως περνάμε parameters σε μια Windows Service

    Να προσθέσω μόνο ένα πραγματάκι, μήπως και φοβήθηκε κανείς διαβάζοντας τα περί Enterprise Library. Η δυνατότητα καταγραφής σε log και επιλογής της τοποθεσίας που αυτό θα αποθηκευτεί είναι δυνατή και εγγενώς από το .NET, απλά με την Enterpise Library μπορεί κανείς να κάνει πολλά περισσότερα, όπως λέει και ο Παναγιώτης.

    Όσο για το UI, Παναγιώτη κι αυτό δεν θα ενημέρωνε το app.config; Ίσως θα μπορούσε να τα έστελνε και με κάποιο .NET remoting στο service για να μην γίνει restart... αλλά τον μπλέκουμε τον άνθρωπο! Νομίζω για τις γνώσεις του καλύτερο είναι το app.config και restart του service όταν γίνει αλλαγή.... αλλά και πάλι το arguments είναι κι αυτό μια λύση, αν και λιγάκι παλιομοδίτικη και όχι τόσο .net oriented! 


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  05-02-2007, 13:32 24536 σε απάντηση της 24532

    Απ:Πως περνάμε parameters σε μια Windows Service

    Τα Trace Listeners τα ανέφερα ήδη, πριν αναφέρω το Enterprise Library. Με το Enterprise Library η δουλειά γίνεται πολύ ευκολότερη, όχι δυσκολότερη. Αντί να αντιγράφω συνέχεια logging κώδικα, γράφω μία γραμμή και τελείωσα. Όσον αφορά το UI, άλλο να λες στον πελάτη ή τον consultant "Πήγαινε σε εκείνη τη γραμμή που λέει PollingTime και βάλε την τιμή xyz" ή "πήγαινε εκεί που λέει connection string και βάλε το server" και άλλο να υπάρχει ένα UI στο οποίο ο άλλος θα βάλει τις τιμές με validation για τυχόν λάθη.

    Από την αρχή ανέφερα ότι όσα γράφω είναι η εμπειρία των τελευταίων μηνών. Ειδικά το θέμα του UI με έχει "τσουρουφλίσει" καθώς κάθε φορά που κάποιος θέλει να αλλάξει μία γραμμή στο app.config με παίρνει τηλέφωνο και ρωτάει "Που είπαμε ότι βάζω το polling ?". Είναι κάτι το οποίο έπρεπε να είχα βάλει από την αρχή, και το οποίο δεν προλαβαίνω να βάλω τώρα.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  05-02-2007, 13:40 24537 σε απάντηση της 24536

    Απ:Πως περνάμε parameters σε μια Windows Service

    Παναγιώτης Καναβός:
    Είναι κάτι το οποίο έπρεπε να είχα βάλει από την αρχή, και το οποίο δεν προλαβαίνω να βάλω τώρα.


    Τα είπες όλα σε μια πρόταση Smile

    Νατάσα Μανουσοπούλου
Σελίδα 1 από 2 (16 εγγραφές)   1 2 >
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems