907 messaggi dal 11 febbraio 2013
In una semplice app windows form (4.6) all'avvio del main passo degli argomenti cosi da poterla eseguire
come attività pianificata

Il programma esegue in parallelo alcuni task

Se uso istanze del form il programma si blocca senza errori quando vuole lui

Se invece uso metodi statici può essere eseguito in utilità di pianificazione correttamente

Come mai? non ho googolato...
Percui se uso metodi statici come di seguito funziona

static async Task Main(string[] args)
        {
            Mapper.Initialize(c => c.AddProfile<MappingProfile>());
            CreateDirectories();

            args = new string[] { "TEST" };//x test
            if (args != null && args.Length > 0)
            {
                var task = args[0];
                if (task == "TEST")
                {
                    try
                    {
                        var watch = Stopwatch.StartNew();

                        await MyForm.LongTaskAsync();
                        ...
                        
                        watch.Stop();
                        var time = watch.ElapsedMilliseconds;

                        await MyForm.SendMailAsync($"...");
                    }
                    catch (Exception ex)
                    {
                        string errorMessage = $"Error from Scheduled Task at {DateTime.Now}." +
                            $" Message: {ex.Message}, Source: {ex.Source}, HResult: {ex.InnerException}";
                        await MyForm.SendMailAsync(errorMessage);
                        await MyForm.LogAsync("Controlli Prezzi", errorMessage);
                    }
                }
                else
                {
                    try
                    {
                        var watch = Stopwatch.StartNew();

                        ...
                        watch.Stop();
                        var time = watch.ElapsedMilliseconds;

                       ...
                    }
                    catch (Exception ex)
                    {
                       ...
                    }
                }
            }
            else
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                var machine = Environment.MachineName;
                    Application.Run(new MyForm());
            }
11.868 messaggi dal 09 febbraio 2002
Contributi
Ciao,
quando pianifichi l'operazione, puoi selezionare "Esegui solo se l'utente è connesso" oppure "Esegui indipendentemente dalla connessione degli utenti". Lo puoi vedere qui:
https://turbolab.it/immagini/2703/max

Selezionando la prima opzione, il processo ha a disposizione un desktop e perciò può usare anche le form. Se invece selezioni la seconda opzione, il processo non potrà aprire form ma potrà solo eseguire codice come se si trattasse di un servizio per Windows. Questo gli consentirà, appunto di essere "eseguito indipendentemente dalla connessione degli utenti", dato che non richiede alcuna interazione da interfaccia grafica.

Da qui:
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc722152(v=ws.11)?redirectedfrom=MSDN

Run whether user is logged on or not. If this radio button is selected, tasks will not run interactively. To make a task run interactively, select the Run only when user is logged on radio button.



Se invece uso metodi statici può essere eseguito in utilità di pianificazione correttamente

Dovresti mettere quella logica in un metodo di una classe apposita che, a seconda della situazione, invocherai dal metodo Main oppure da un Form. In questo modo non dovrai duplicare il codice.

ciao,
Moreno

Enjoy learning and just keep making
907 messaggi dal 11 febbraio 2013
Grazie Moreno

In effetti ora ho duplicato i metodi creandone di statici ... metodoUnoStaticAsycn()
per chiamarli dal Main

Non ho capito come creare una classe che intercetti l'utente e lanci un metodo a seconda di come parte l'app... :(

Cmq ho notato un'altra cosa sicuramente correlata

Se creo un progetto vuoto e faccio semplicemente questo

static async Task Main(string[] args)
        {
            args = new string[] { "test" };
            if (args.Length > 0)
            {
                var task = args[0];
                if (task == "test")
                {
                    Console.WriteLine("Start.");

                    var form = new Form1();
                    await form.DoSomeAsync();
                    await form.DoOtherAsync();

                    Console.WriteLine("End.");
                }
            }
            else
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }


public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }

        public async Task DoSomeAsync()
        {
            await Task.Delay(6000);
            Console.WriteLine("DoSomeAsyn...");
        }
        public async Task DoOtherAsync()
        {
            await Task.Delay(3000);
            Console.WriteLine("DoOtherAsync...");
        }
    }


poi metto un break point su uno dei due metodi il debug si interrompe senza errori

per questo sono finito con l'orrore di duplicare i metodi

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.