2011-08-12 4 views
1

Quelqu'un peut-il aider à transformer/fournir un squelette de la façon de transformer le code ci-dessous pour les deux fonctions en cours d'exécution simultanément, à la fois avec leurs propres minuteries distinctes.C# Minuterie 2 Actions Parallèlement

public void Controller() 
{ 
    List<int> totRand = new List<int>(); 
    do 
    { 
     Thread.Sleep(new TimeSpan(0,0,0,1)); 
     totRand.Add(ActionA()); 
    } while (true); 

    do 
    { 
     Thread.Sleep(new TimeSpan(0,0,0,30)); 
     ActionB(totRand); 
     totRand = new List<int>(); 
    } while (true); 
} 

public int ActionA() 
{ 
    Random r = new Random(); 
    return r.Next(); 
} 

public void ActionB(List<int> totRand) 
{ 
    int total = 0; 

    //total = add up all int's in totRand 

    Console.WriteLine(total/totRand.Count()); 
} 

Il est évident que ce qui précède ne marcherait jamais, mais le principal est qu'une méthode circule toutes les 1 seconde ajoute des données à une liste.

Une autre action s'exécute également sur une minuterie et prend tout ce qui peut être dans cette liste et fait quelque chose avec elle, puis efface la liste. (ne pas s'inquiéter du contenu de la liste changeant pendant que je fais ceci). J'ai lu attentivement des tutoriels et des exemples, mais je ne peux tout simplement pas comprendre comment je m'y prendrais. Des idées/astuces?

+1

La bibliothèque .NET contient 3 ou 4 classes Timer. Lequel utilisez-vous? –

+0

Vous savez que créer plusieurs instances de 'Random' en utilisant le constructeur par défaut en succession rapide est cassé? Créez une instance par thread et réutilisez-la. – CodesInChaos

+0

@CodeInChaos - était juste un petit exemple, ne sera pas réellement faire cela, mais merci:) – ct5845

Répondre

3

Pour exécuter deux actions en même temps sur l'intervalle, vous pouvez utiliser System.Threading.Timer

private readonly Timer _timerA; 
private readonly Timer _timerB; 

// this is used to protect fields that you will access from your ActionA and ActionB  
private readonly Object _sharedStateGuard = new Object(); 

private readonly List<int> _totRand = new List<int>(); 

public void Controller() { 
    _timerA = new Timer(ActionA, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); 
    _timerB = new Timer(ActionB, null, TimeSpan.Zero, TimeSpan.FromSeconds(1)); 
} 

private void ActionA(object param) { 
    // IMPORTANT: wrap every call that uses shared state in this lock 
    lock(_sharedStateGuard) { 
     // do something with 'totRand' list here   
    } 
} 

private void ActionB(object param) { 
    // IMPORTANT: wrap every call that uses shared state in this lock 
    lock(_sharedStateGuard) { 
     // do something with 'totRand' list here   
    } 
} 

état partagé, dans le contexte de votre question, serait la liste que vous souhaitez manipuler dans les deux actions: totRand.

+0

merci! Concis facile à suivre et m'a définitivement aidé sur mon chemin:) – ct5845