none
Ritardo in threading per esecuzione metodo RRS feed

  • Domanda

  • Ciao a tutti,

    Avrei bisogno di un ritardo nel lancio di un metodo che non mi impegni il programma durante il conteggio: quindi lancio il ritardo, il programma continua la sua esecuzione, scade il ritardo, lancio il metodo ed elimino il timer.

    Come potrei agire? Sto provando con

                    System.Threading.Timer ritardo = new System.Threading.Timer(allarmeON, , ritardoAllarme, ritardoAllarme);
    
    ma non ne vengo fuori :-(


    Vi ringrazio

    lunedì 3 novembre 2014 22:32

Risposte

  • Ciao a tutti,

    Avrei bisogno di un ritardo nel lancio di un metodo che non mi impegni il programma durante il conteggio: quindi lancio il ritardo, il programma continua la sua esecuzione, scade il ritardo, lancio il metodo ed elimino il timer.

    Come potrei agire? Sto provando con

                    System.Threading.Timer ritardo = new System.Threading.Timer(allarmeON, , ritardoAllarme, ritardoAllarme);
    ma non ne vengo fuori :-(


    Vi ringrazio

    Puoi usare il Delay messo a disposizione dalla class Task. Esempio:

        async Task EsecuzioneMetodoConDelay(int millisecondi)
        {
            await Task.Delay(millisecondi);
            Metodo(); 
        }        
    dove "Metodo" è il metodo da eseguire dopo un certo ritardo. (Per il metodo potresti usare anche un delegate).



    • Modificato BlueLed martedì 4 novembre 2014 13:16
    • Proposto come risposta Paolo Pranzo martedì 4 novembre 2014 18:50
    • Contrassegnato come risposta 82_marco giovedì 6 novembre 2014 20:20
    martedì 4 novembre 2014 13:12

Tutte le risposte

  • Ciao a tutti,

    Avrei bisogno di un ritardo nel lancio di un metodo che non mi impegni il programma durante il conteggio: quindi lancio il ritardo, il programma continua la sua esecuzione, scade il ritardo, lancio il metodo ed elimino il timer.

    Come potrei agire? Sto provando con

                    System.Threading.Timer ritardo = new System.Threading.Timer(allarmeON, , ritardoAllarme, ritardoAllarme);
    ma non ne vengo fuori :-(


    Vi ringrazio

    Puoi usare il Delay messo a disposizione dalla class Task. Esempio:

        async Task EsecuzioneMetodoConDelay(int millisecondi)
        {
            await Task.Delay(millisecondi);
            Metodo(); 
        }        
    dove "Metodo" è il metodo da eseguire dopo un certo ritardo. (Per il metodo potresti usare anche un delegate).



    • Modificato BlueLed martedì 4 novembre 2014 13:16
    • Proposto come risposta Paolo Pranzo martedì 4 novembre 2014 18:50
    • Contrassegnato come risposta 82_marco giovedì 6 novembre 2014 20:20
    martedì 4 novembre 2014 13:12
  • Ciao,

    Grazie del consiglio pero' provando mi vengono restituiti 2 errori che non riesco a risolvere. ti faccio vedere come ho fatto:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    
    namespace gestionecomandi
    {
        class GestioneFinestraAllarmi
        {
            string NumeroAllarme = GestioneComandi.RigaDaGestire.Substring(61, 3); //Ricavo il numero dell' allarme presente nel file allarmi
            int ritardoAllarme = int.Parse(GestioneComandi.RigaDaGestire.Substring(64, 5)); //Ritardo per l'attuzione dell'allarme
            
            async Task RitardoSegnalazioneAllarme(int millisecondi)
            {
                await Task.Delay(millisecondi);
                allarmeON();
            } 
    
            public void comandoAllami(char risultato)
            {
                if (risultato == '1')
                {
                    RitardoSegnalazioneAllarme(ritardoAllarme);       
                }
                else if (risultato == '0')
                {
                    allarmeOFF();
                }
            }
    
            private void allarmeON()
            {            
             //   finestraAllarmi1.AggiuntaAllarme(NumeroAllarme);
             //   lampeggio = true;
            }
    
            private void allarmeOFF()
            {
               // finestraAllarmi1.RientroAllarme(NumeroAllarme);
            }
        }
    }

    Mi potresti aiutare a capire dove sbaglio?

    GRazie

    martedì 4 novembre 2014 23:00
  • Che errori sono? Forse la versione del C# che stai usando non supporta i task?

    martedì 4 novembre 2014 23:59
  • Se dovesse essere un problema di versione del C#, potresti utilizzare  questo:

            void RitardoSegnalazioneAllarme(int millisecondi)
            {
                System.Windows.Forms.Timer t = new Timer();
                t.Interval = millisecondi;
                t.Tick += (s, ev) => { (s as Timer).Stop(); (s as Timer).Dispose(); allarmeON(); };
                t.Start(); 
            } 

    mercoledì 5 novembre 2014 09:36
  • Ciao,

    Avevo provato il codice con visual studio 2010 e mi dava errore, adesso ho provato con il 2013 (net framework 4.5.1) e gli errori non ci sono piu'.

    mi e' rimasto solo questo avviso:

    Poiché la chiamata non può essere attesa, l'esecuzione del metodo corrente continua prima del completamento della chiamata. È possibile applicare l'operatore 'await' al risultato della chiamata.

    in questa riga:

                    RitardoSegnalazioneAllarme(ritardoAllarme);

    Non capisco cosa vuole dire :-(

    Grazie

    giovedì 6 novembre 2014 00:21
  • Ciao,

    Avevo provato il codice con visual studio 2010 e mi dava errore, adesso ho provato con il 2013 (net framework 4.5.1) e gli errori non ci sono piu'.

    mi e' rimasto solo questo avviso:

    Poiché la chiamata non può essere attesa, l'esecuzione del metodo corrente continua prima del completamento della chiamata. È possibile applicare l'operatore 'await' al risultato della chiamata.

    in questa riga:

                    RitardoSegnalazioneAllarme(ritardoAllarme);

    Non capisco cosa vuole dire :-(

    Grazie


    Il comportamento di cui ti avvisa è proprio quello che vuoi ottenere, cioè "non attendere il completamento della chiamata".

    Quel warning è spiegato qui:

    http://msdn.microsoft.com/en-us/library/hh873131.aspx

    In particolare dice:

    "You should consider suppressing the warning only if you're sure that you don't want to wait for the asynchronous call to complete and that the called method won't raise any exceptions. In that case, you can suppress the warning by assigning the task result of the call to a variable."

    Se guardi l'esempio riportato, nel commento "Call #2" mostra come badare al warning in questo caso, cioè assegnare il risultato del metodo async ad una variabile di tipo Task.

    Task delayTask = CalledMethodAsync(delay);




    • Modificato BlueLed giovedì 6 novembre 2014 08:48
    giovedì 6 novembre 2014 08:47
  • Grazie

    Mi hai dato un grande aiuto

    giovedì 6 novembre 2014 20:21
  • Scusa se riapro il post, mi poresti dire come usare il commento Call #2? non riesco ad eliminare il messaggio
    giovedì 6 novembre 2014 21:33
  • Task taskRitardo = RitardoSegnalazioneAllarme(ritardoAllarme);

    giovedì 6 novembre 2014 21:52
  • Ciao,

    Scusa il ritardo e la mia incapacita' a capire, ma non riesco a togliere il messaggio :-(


    lunedì 10 novembre 2014 20:42
  • Ciao,

    Scusa il ritardo e la mia incapacita' a capire, ma non riesco a togliere il messaggio :-(


    Io l'ho provato così e dà il warning:

        public class Program
        {
            public static void Main(string[] args)
            {            
                Console.WriteLine ("A"); 
                RitardoSegnalazioneAllarme(1000);
                Console.WriteLine ("B");
                System.Threading.Thread.Sleep(2000);             
            }        
            
            static async Task RitardoSegnalazioneAllarme(int millisecondi)
            {
                Console.WriteLine ("C");
                await Task.Delay(millisecondi);
                Console.WriteLine ("D");
            }         
        }

    Poi l'ho provato così e non lo dà più:

        public class Program
        {
            public static void Main(string[] args)
            {            
                Console.WriteLine ("A"); 
                Task t = RitardoSegnalazioneAllarme(1000);
                Console.WriteLine ("B");
                System.Threading.Thread.Sleep(2000);             
            }
                    
            static async Task RitardoSegnalazioneAllarme(int millisecondi)
            {
                Console.WriteLine ("C");
                await Task.Delay(millisecondi);
                Console.WriteLine ("D");
            }         
        }


    • Modificato BlueLed lunedì 10 novembre 2014 22:11
    lunedì 10 novembre 2014 22:11
  • Ciao,

    Non ci ero arrivato :-(

    GRazie e scusami dell'insistenza

    martedì 11 novembre 2014 22:03