Dites le ci-dessous est votre classe responsable de faire le travail avec la boucle en elle. Ajouter un événement pour indiquer votre progression Puis à partir de votre interface utilisateur simplement gérer cet événement et mettre à jour la barre de progression en conséquence.
sealed class Looper
{
public event EventHandler ProgressUpdated;
private int _progress;
public int Progress
{
get { return _progress; }
private set
{
_progress = value;
OnProgressUpdated();
}
}
public void DoLoop()
{
_progress = 0;
for (int i = 0; i < 100; ++i)
{
Thread.Sleep(100);
Progress = i;
}
}
private void OnProgressUpdated()
{
EventHandler handler = ProgressUpdated;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
}
Vous pourriez mettre en œuvre en ayant une BackgroundWorker
dans le cadre de l'interface utilisateur, où vous appelez looper.DoLoop()
en cas backgroundWorker.DoWork
. Ensuite, dans votre gestionnaire pour l'événement looper.ProgressUpdated
, vous pouvez appeler backgroundWorker.ReportProgress
pour incrémenter votre barre de progression à partir du fil de l'interface utilisateur. Notez qu'il serait probablement plus logique d'inclure la progression elle-même dans les informations portées par votre événement ProgressUpdated
(je ne voulais pas écrire une nouvelle classe dérivant de EventArgs
pour illustrer cela, vous avez probablement l'image en tous cas).
Notez également que ce qui précède n'a vraiment de sens que si vous exécutez votre code avec la boucle sur un thread distinct du thread de l'interface utilisateur. Sinon, tout votre travail se fait avant la prochaine actualisation de l'interface utilisateur, de sorte que votre barre de progression ne fournira aucune valeur (elle passerait de 0 à 100 une fois la boucle terminée).
Juste un exemple de la façon dont ce genre de chose peut être atteint.
Qu'est-ce qui ne va pas avec un événement aux niveaux inférieurs qui annonce la progression? – Joey
Désolé, je ne comprends pas ce que vous venez de dire.La barre de progression est définie dans une classe supérieure, si je mets à jour la valeur dans la classe inférieure comment la classe supérieure le sait-elle? Je devrais passer l'instance de la classe ui ou l'instance de la barre de progression aux niveaux inférieurs. –
Je ne suis pas certain, mais si la mise à jour est retardée, cela ressemble presque à un problème de threading. Utilisez-vous invoke (si nécessaire)? –