2012-06-15 4 views
1

Quelle est la manière la plus simple/la plus simple de retarder l'intérieur d'une fonction sans avoir à retarder le thread principal?
C'est ce que je suis en train de faire est semblable à ceci:Meilleure façon de retarder

private void FallingToggle(bool a) 
    { 
     a = true; 
     Thread.Sleep(1000); 
     a = false; 
    } 

Mais je trouve qu'il a gelé le programme.
Y at-il un moyen de contourner cela? Ou y a-t-il une manière plus simple d'aborder cela?

+2

Ce code suggère de sérieuses failles de conception dans votre projet, vous devriez reconsidérer la nécessité de dormir arbitrairement pour 1000. Qu'est-ce que vous voulez faire? – Arafangion

+1

C'est vraiment la méthode la plus simple pour retarder (et seulement l'approche générale pour retarder * de manière synchrone *). Cependant, comme vu, cela * bloque * le thread actuel. Sinon, envisagez de passer à un modèle * asynchrone * (par exemple, Temporisateur et rappels). –

+0

Pouvez-vous expliquer pourquoi vous voulez retarder comme ça? Ça sens le poisson. – JohnFx

Répondre

6

En réponse à votre commentaire, il y a plusieurs façons d'atteindre ce que vous essayez de faire.

Une façon est d'enregistrer le moment où l'action se produit la première fois (ce qui peut être réalisé en utilisant DateTime.Now). Ensuite, si des actions ultérieures se produisent dans la seconde de la durée enregistrée, retournez immédiatement. Exemple:

DateTime lastActionTime = DateTime.Now; 

// ... 

if ((DateTime.Now - lastActionTime).Milliseconds < 1000) 
{ 
    // Too soon to execute the action again 
    return; 
} 

// Do whatever the action does... 

Une autre façon de faire, dans le cas où vous souhaitez désactiver un bouton pendant une seconde, est d'utiliser un Timer (il y a plusieurs minuteurs dans le .NET Framework, j'utilise le Winforms version ici). Une fois l'action effectuée, vous désactivez le bouton ou un autre élément de l'interface utilisateur, puis démarrez un Timer, avec un intervalle d'une seconde. Une fois la minuterie désactivée, vous pouvez réactiver l'élément d'interface utilisateur, ce qui permet à l'utilisateur d'exécuter à nouveau l'action. Exemple:

// In a constructor or something 
timer = new System.Windows.Forms.Timer(); 
timer.Interval = 1000; // 1000 milliseconds 
timer.Tick += (s, e) => 
{ 
    button.Enabled = true; 
    timer.Stop(); 
}; 

// ... 

void OnButtonClick() 
{ 
    button.Enable = false; 
    timer.Start(); 

    // Do whatever the button does... 
} 

Ce dernier est ce que vous utilisez dans une interface graphique, l'ancien pourrait être utilisé dans quelque chose comme un jeu.

0

est ici le chemin ..

En cas d'appel de fonction après a = true; Commencer un nouveau fil. Et mettre

dans le nouveau thread. Je pense que c'est le moyen le plus simple.

+0

Ne devrait pas utiliser thread.sleep. L'option de minuterie avec une option de bouton de désactivation que 'mgbowen' a fourni dans sa réponse est un meilleur design. –

Questions connexes