789 messaggi dal 11 febbraio 2013
ciao,
forse ho già chiesto ma cercando nello storico delle mie domande non ho trovato.

Ho una semplice applicazione windows form con tre button:
-serializza tabelle
-comprimi file .bin
-invia comprezzi.zip via ftp

Vorrei creare un servizio windows giornaliero da far partire la notte
(...dovrei fare un'altro servizio che gira sulla macchina che riceve il file per deserializzare.).

Ho trovato questo semplice tutorial
https://www.aspsnippets.com/Articles/Tutorial-to-create-a-simple-Windows-Service-with-sample-example-in-C-and-VBNet.aspx

Non avendo mai scritto un servizio ho dei dubbi.
Pensavo di trasferire tutto il codice nel servizio e creare dei task ... poi con Wait() aspettare che ognuno
termini prima di eseguire il successivo.

Sbaglio approccio?
11.267 messaggi dal 09 febbraio 2002
Contributi
Dato che hai già creato l'applicazione Winforms, credo che ti convenga riutilizzare quella. Devi solo fare in modo che possa prendere l'input da riga di comando e poi predisponi un'operazione pianificata di Windows alle 3 di notte che invoca l'eseguibile passando tale input.

Se invece vuoi fare un servizio per windows puoi seguire quel tutorial oppure usare TopShelf. Ecco un esempio.
http://docs.topshelf-project.com/en/latest/configuration/quickstart.html


Pensavo di trasferire tutto il codice nel servizio

In caso metti la logica in una class library in modo che potrai sfruttarla sia dal servizio per windows che dall'applicazione winforms.

ciao,
Moreno

Enjoy learning and just keep making
789 messaggi dal 11 febbraio 2013
Cosa intendi per riga di comando?

Posso pianificarla anche su windows server?

infine perdona la domanda sciocca
debbo comunque rivedere la logica dei bottoni perchè l'utente capiva quando l'operazione terminava
grazie ad una progress bar su ogni bottone.

Con una operazione pianificata come farei?

scusa e grazie davvero
11.267 messaggi dal 09 febbraio 2002
Contributi
Ciao,


Posso pianificarla anche su windows server?

Certamente, le operazioni pianificate (o Scheduled Tasks in inglese) esistono anche su Windows Server.


Cosa intendi per riga di comando?

La tua applicazione ha un eseguibile, giusto? Ad esempio MiaApplicazione.exe. Ebbene, puoi aprire l'applicazione anche da Prompt dei comandi, passandogli degli argomenti. Tipo:
MiaApplicazione.exe "C:\Percorso\File.txt"


Puoi raccogliere gli argomenti passati da riga di comando, in questo caso "C:\Percorso\File.txt", e avviare l'esecuzione della tua procedura che agirà su quel file. Quindi, non devi aspettare che l'utente clicchi dei bottoni o usi le varie parti dell'interfaccia perché l'oggetto dell'operazione è già stato indicato da riga di comando, ed è il file "C:\Percorso\File.txt" su cui andrai ad agire.

Ecco degli esempi su come leggere gli argomenti passati da riga di comando.
https://stackoverflow.com/questions/1179532/how-do-i-pass-command-line-arguments-to-a-winforms-application


Con una operazione pianificata come farei?

Non c'è necessità di visualizzare nessun bottone e nessuna finestra. Semplicemente l'applicazione esegue il lavoro e poi esce. Tanto l'operazione viene eseguita di notte, non c'è alcun utente lì davanti. Puoi però produrre un log in modo che la mattina dopo l'utente possa verificare se il lavoro è stato svolto.

ciao,
Moreno

Enjoy learning and just keep making
789 messaggi dal 11 febbraio 2013
Non ho capito fino in fondo

Nell'eseguibile c'è un bottone che lancia la serializzazione in un nuovo thread
private void btnSerializza_Click(object sender, EventArgs e)
        {
            if (ddlAnno.SelectedItem == null)
            {
                MessageBox.Show("Seleziona l'anno");
                return;
            }

            Year = Convert.ToInt32(ddlAnno.SelectedItem.ToString());
            btnSerializza.Enabled = false;
            timer1.Enabled = true;
            Thread workerThread = new Thread(new ThreadStart(Serialize));
            workerThread.Start();
        }


Ora nell'operazione pianificata questo come si traduce?
Non ci arrivo
colpa mia
scusa ancora (:
11.267 messaggi dal 09 febbraio 2002
Contributi
Quando crei l'operazione pianificata di Windows indichi il percorso dell'eseguibile dell'applicazione e l'anno come argomento. Ecco un'immagine di esempio:
https://turbolab.it/immagini/2710/med
In questa immagine è stato scelto l'eseguibile iexplore.exe, tu ovviamente dovrai indicare il percorso del tuo eseguibile.
Nella casella sotto, dove è stato inserito http://turbolab.it, ci metti invece 2019 o l'anno che vuoi passare come argomento.

Poi, dalla tua applicazione vai nel metodo Main (che si trova in Program.cs) e lo modifichi più o meno così. Non copiare-incollare, devi capire quello che sto facendo e applicarlo al tuo caso.
static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
        if (args != null && args.Length > 0)
        {
          //Sono stati passati degli argomenti. Leggo il primo, dev'essere l'anno
          var anno = args[0];
          //Poi qui passi l'anno alla procedura Serialize. Sai tu come è fatta.
          //La devi spostare su un metodo statico in modo che sia richiamabile da qui.
          Serialize(anno);
        }
        else
        {
          //Avvio la UI normalmente
          Application.EnableVisualStyles();
          Application.SetCompatibleTextRenderingDefault(false);
          Application.Run(new Form1());
        }
    }
}


ciao,
Moreno

Enjoy learning and just keep making
789 messaggi dal 11 febbraio 2013
capito
grazie 1000
789 messaggi dal 11 febbraio 2013
ciao Moreno
ho fatto come dicevi:
ho spostato la logica in una classLibrary
ho reso i metodi statici

e ho simulato di aver passato argomenti all'operazione pianificata:
static void Main(string[] args)
        {

            //simulo argomenti
            var year = DateTime.Now.Year.ToString();
            string[] tmp = new string[] { year};


            if (tmp != null && tmp.Length > 0)
            {
                Task.Run(() =>
                {
                    Form1.Serialize();//creo .bin
                }).Wait();

                Task.Run(() =>
                {
                    Form1.Compress(); //creo compressi.zip
                }).Wait();

                Form1.FtpUpload(); //trasferisco ftp

            }
            else
            {
                //avvio UI normalmente
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }


funziona bene
ma ho errori nei percorsi di cui non mi ero accorto perchè usavo i percorsi assoluti sul mio pc
ma ora dovendo installare su server non vanno bene cosi ho provato
 var currentDir = AppDomain.CurrentDomain.BaseDirectory.Replace(@"\bin\Debug\", "");
 string pathAgenti = currentDir + @"\BINARY\Agenti.bin";


ma ovviamente funziona solo in debug!

come debbo fare?
considera che per pubblicare uso semplicemente click destro > pubblica

perdona la domanda fuori oggetto

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.