2010-12-07 3 views
1

J'apprécie votre aide à l'avance. Je suis relativement novice en programmation, alors allez-y doucement. À l'heure actuelle, j'ai une boucle qui prend beaucoup de temps et que j'ai vraiment besoin de lancer en dehors du thread de l'interface utilisateur, car Update() met à jour une barre de progression, ce qui n'est pas le cas. J'ai regardé quelques tutoriels de threads courts, et les mises à jour ne sont jamais restituées tant que la grosse boucle n'est pas terminée.Mettre une section de code sur un fil différent?

private void Button_Convert_Click(object sender, RoutedEventArgs e) 
{ 
MachineAngleCalculations.Instance.Arm1Length_Arbitrary = 12; 
MachineAngleCalculations.Instance.Arm2Length_Arbitrary = 11; 

int resolution = 100000; //points per shape 
double xstep, ystep, x, y; 

int totalpoints = resolution * ShapeList.Count; 
int calculatedpoints = 0; 
ProgStat.Update(calculatedpoints, totalpoints, "Calculated", "individual instructions."); 

InstructionList.Clear(); 

foreach (MachineLine item in ShapeList) 
{ 
    xstep = (item.End.X - item.Start.X)/(resolution - 1); 
    ystep = (item.End.Y - item.Start.Y)/(resolution - 1); 

    for (int i = 0; i < resolution; i++) 
    { 
    x = item.Start.X + xstep * i; 
    y = item.Start.Y + ystep * i; 
    InstructionList.Add(MachineAngleCalculations.Instance.XYtoMachineInstrution(x, y, 1)); 
    calculatedpoints += 1; 
    ProgStat.Update(calculatedpoints, totalpoints, "Calculated", "individual instructions."); 
    } 
} 
} 

Alors, quelle est la façon la plus simple d'exécuter la boucle foreach sur un thread différent? Y at-il un moyen de le faire sans le mettre dans une fonction différente?

+0

http://stackoverflow.com/questions/670510/threading-in-net –

Répondre

0

solution simple sera en utilisant BackgroundWorker Classe

+0

Pouvez-vous montrer comment faire cela sans avoir à le mettre dans une nouvelle fonction? –

+1

@Adam S - Utilisez-vous un compilateur bizarre où vous devez payer pour chaque fonction que vous définissez? :-P –

+0

La raison pour laquelle je veux éviter ceci est parce que si c'est dans une fonction séparée, cette fonction n'aura pas accès aux variables définies dans Button_Convert_Click. –

1

Vous pouvez essayer:

Aynchronous Programmation

Asynchronous Method Invocation (tutoriel jamais !! Le meilleur)

Contexte travailleur

BackgroundWorker Class Sample for Beginners

+0

Qu'est-ce que "MethodInvoker" dans ce tutoriel? Il le référence 16 fois, et ne le définit jamais une seule fois. –

+0

C'est un délégué spécial qui peut être utilisé pour appeler une fonction qui n'a pas de paramètre et le type de retour est vide. –

Questions connexes