2010-02-28 5 views
0
private void ParallelCrashTest() 
{ 

    for (int x = 0;x < 100; x++) 
    { 
     Dowork_1(i); 
    } 
} 

private void Dowork_1(int i) 
{ 
ThreadInfo threadInfo = new ThreadInfo(); 
threadInfo.first = 0; 
threadInfo.last = 100; 
for (int x = 0;x < 60; x++) 
    { 
     Dowork_2(threadinfo); 
     progressBar2.Value = x + 1; 
    } 
} 
private void Dowork_2(object param) 
{ 

    ThreadInfo threadInfo = param as ThreadInfo; 
    int first = threadInfo.first; 
    int last = threadInfo.last; 
    Parallel.For(first, last, i => 
    { 

     didsomthing... 

    } 

    Update(); 

} 

Cela ne fonctionne donc pas. (CPU fonctionne 90-100%, cela signifie que je devine encore travailler mon application) J'ai utilisé Update() au lieu de Application.DoEvent(). Mon application est crash ou ne peut pas mettre à jour(). Je ne sais pas . Je pense que le problème est Update() mais je ne suis pas sûr. Avez-vous une suggestion ? Merci.stacktrace sur VS2010

+2

Qu'est-ce que c'est «didsomthing? Je parie que tout ce qui provoque cette chute est là. Probablement essayer de mettre à jour l'interface graphique. – Aaronaught

+2

@le fail troll échoue. J'adore aussi les questions "MY APP CRASHED HURR" avec * aucun détail d'exception *. Comme on peut brandir une baguette magique et savoir pourquoi quelque chose s'est écrasé. En outre, Application.DoEvents dans une application multithread? Guy doit s'asseoir avec un bon livre et apprendre. – Will

+0

@Will: Vous voulez dire que vous n'avez pas de baguette de débogage magique? J'ai payé le gros prix pour le mien, mais ça valait le coup, pas plus d'accidents d'application embêtants! – Aaronaught

Répondre

2

Crash dans quel sens? Je suppose que vous essayez de mettre à jour l'interface graphique d'un autre thread, par exemple pour mettre à jour la barre de progression. Pour ce faire, vous devez utiliser Invoke.

Il serait utile que vous fournissiez un exemple minimaliste simplifié mais complet de code de compilation qui reproduit l'erreur afin que nous n'ayons pas à deviner. Vous pouvez le faire en copiant votre projet dans un nouveau dossier et en supprimant les fichiers, classes, méthodes et lignes inutiles jusqu'à ce qu'il soit impossible de supprimer plus de lignes tout en reproduisant l'erreur.

+0

En fait quand j'utilise l'échantillon "For" en boucle c'était bien mais cela prend beaucoup de temps. J'ai donc besoin de réduire le temps. Je viens de changer "Parallel.For" au lieu de "For". Je pense que ça n'a pas d'importance parce que ça marche quand j'utilise la boucle "for" – tonyontlga

+0

@tonontlga: Quand vous utilisez 'for' il s'exécute dans le même thread. 'Parallel.For' est autorisé à utiliser de nombreux threads différents. Je pense que votre problème est que vous mettez à jour le GUI à l'intérieur du parallèle, mais cela pourrait aussi être quelque chose d'autre lié au threading. Vous n'avez pas fourni suffisamment de code pour que je sache quel est le problème. Essayez de créer un exemple simplifié minimal compilable et exécutable qui reproduit l'erreur et l'affiche. –

+0

Oui j'utilise la barre de progression. Mon application fonctionne pendant quelques minutes Soudain, il s'est écrasé Je veux dire milieu de la durée de vie du programme. :) – tonyontlga

1

Ni la méthode Update() ni l'affectation progressBar2.Value ne sont autorisés dans un thread de travail. Il ne plantera pas Visual Studio, pas même VS2010, vous obtiendrez une IllegalOperationException simple pour vous dire que vous faites quelque chose d'incorrect.

Vous devrez utiliser la méthode Control.Invoke(). Il y a un bon exemple dans l'article MSDN que j'ai lié.

+0

ouais j'ai utilisé le fil de travail. C'est comme un processus de contournement. Mais cela prend beaucoup de temps à l'intérieur de la boucle "paralle.for". Voilà pourquoi ce n'était pas bon. Je dois organiser l'horaire. – tonyontlga