3 votes

Appeler une méthode qui renvoie une valeur toutes les 5 secondes

Je souhaite appeler une méthode qui renvoie une valeur toutes les quelques secondes. J'ai essayé d'utiliser un Timer con elapsedEventandler mais le type de retour de la méthode est void dans ce cas. J'ai utilisé la méthode TimerTask pour effectuer la même tâche en Java.

Je veux qu'il soit en .NET 2.0 car j'utilise Visual Studio 2005.

Voici le programme qui me pose problème. J'ai essayé d'utiliser une méthode anonyme, mais la valeur de response dans ce cas, n'existe pas en dehors de la méthode anonyme :

public static string Run(string address)
{                     
    string response = "A";
    Timer t = new Timer();
    t.Elapsed += delegate 
    {                         
        response = callURL(address);
        console.writeln(response);
        // The actual response value is printed here                
    };          
    t.Interval = 3000;
    t.Start();                      
    Console.WriteLine("response string is " + response);
    // response string is A

    return response;
}

public static string callURL(string address)
{
    className sig = new ClassName(); 
    String responseBody = sig.getURL(address);

    return responseBody;
}

Comment obtenir la valeur de response dans le Run et l'envoyer à l'appelant de la méthode Run méthode ?

9voto

James Michael Hare Points 19077

Vous pourriez demander à votre appelant de donner à la classe avec la minuterie un délégué de rappel pour renvoyer la valeur.

public class YourClass
{
    public static void Run(string address, Action<string> callback)
    {                     
        Timer t = new Timer();
        t.Elapsed += delegate {                         
            var response = callURL(address);

            callback(response);
        };          
        t.Interval = 3000;
        t.Start();
    }
}

public class OtherClass
{
    public void ProcessResponse(string response)
    {
         // do whatever you want here to handle the response...
         // you can write it out, store in a queue, put in a member, etc.
    }

    public void StartItUp()
    {
         YourClass.Run("http://wwww.somewhere.net", ProcessResponse);
    }
}

MISE À JOUR : Si vous souhaitez que l'appelant ( OtherClass ) pour pouvoir annuler la minuterie, vous pourriez simplement passer d'un Action<string> à un Func<string, bool> et que l'appelant ( OtherClass ) renvoie un bool indiquant s'il faut arrêter le timer ou non...

public class YourClass
{
    public static void Run(string address, Func<string, bool> callback)
    {                     
        Timer t = new Timer();
        t.Elapsed += delegate {                         
            var response = callURL(address);

            // if callback returns false, cancel timer
            if(!callback(response))
            {
                t.Stop();
            }
        };          
        t.Interval = 3000;
        t.Start();
    }
}

public class OtherClass
{
    public bool ProcessResponse(string response)
    {
         // do whatever you want here to handle the response...
         // you can write it out, store in a queue, put in a member, etc.
         // check result to see if it's a certain value...
         // if it should keep going, return true, otherwise return false
    }

    public void StartItUp()
    {
         YourClass.Run("http://wwww.somewhere.net", ProcessResponse);
    }
}

0voto

tmjam Points 509

Créer un Thread et faire en sorte que le thread appelle la méthode que vous voulez et lui donner un temps de sommeil de 5 secondes :

Thread loopThread = new Thread(new ThreadStart(this.MainLoop));
loopThread.Start();

private void MainLoop()
{
     while(true)
     {
         // Do stuff
         Thread.Sleep(5000);
     }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X