2013-05-24 3 views
-1

J'utilise le code ci-dessous pour appeler une méthode à partir de la fonction de filetage.Il ne fonctionne pas.Veuillez m'aider à le faire.Appeler une fonction à partir du fil

DataTable dt = get_data(Convert.ToInt32(Start_From), Convert.ToInt32(End_To)); 
foreach (DataRow dr in dt.Rows) 
{ 
    ThreadStart newThread = new ThreadStart(delegate { insert_Data(dr); }); 
    Thread myThread = new Thread(newThread); 
} 

public static DataTable get_Data(int form,int to) 
{ 
    ..... 
    return Dt; 
} 

[MTAThread] 
public static string insert_Data(DataRow dr) 
{ 
.....SOme code here //This funcion not call 
} 
+0

Pensez à utiliser un 'Queue' pour transmettre des données à un pool de threads. Votre code commencera un fil pour chaque rangée qui est très inefficace. – Romoku

+0

Suis nouveau pour ce concept. Donne-moi une idée. – user2176150

Répondre

1

Vous devez également démarrer le thread en appelant myThread.Start();

foreach (DataRow dr in dt.Rows) 
{ 
    DataRow dataRow = dr; 
    ThreadStart newThread = new ThreadStart(delegate { insert_Data(dataRow); }); 
    Thread myThread = new Thread(newThread); 
    myThread.Start(); 
} 

Lorsqu'un thread est construit, il ne fonctionne pas initialement; vous devez le faire explicitement en utilisant la méthode Thread.Start. Cela vous donne un peu plus de contrôle sur le début de l'exécution du thread.

Édition: fixe pour l'utilisation d'une valeur fermée.

+0

ça marche très lentement. – user2176150

+0

Ne fonctionne pas. Les valeurs fermées à l'intérieur du délégué causeront des problèmes. –

+0

Qu'est-ce qui est très lent? Combien lent? Quoi qu'il en soit, la lenteur n'a rien à voir avec la question que vous avez posée à l'origine. Vous avez probablement besoin de poster une autre question si vous avez un problème avec la performance. – Polyfun

2

Vous avez fait deux erreurs: - Vous avez oublié de démarrer le fil (comme indiqué dans une réponse) - Vous utilisez une valeur fermée. Ce comportement est incorrect, car la fonction thread recevra la mauvaise ligne. Voir: http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx

Essayez ceci:

foreach (DataRow dr in dt.Rows) 
{ 
    DataRow localRow = dr; 
    ThreadStart newThread = new ThreadStart(delegate { insert_Data(localRow); }); 
    Thread myThread = new Thread(newThread); 
    myThread.Start(); 
} 

Pour créer un fil pour une petite opération n'est pas recommandé. Essayez d'utiliser le threadpool, pour des performances:

foreach (DataRow dr in dt.Rows) 
{ 
    Action<DataRow> action = (row) => insert_Data(row); 
    action.BeginInvoke(dr, null, null); 
} 

Une autre solution est-il utiliser PLINQ:

Parallel.ForEach(dt.AsEnumerable(), dr => insert_Data(dr)); 
0

1: Pourquoi voudriez-vous commencer un fil pour chaque ligne de données que vous trouvez?
2: Pour démarrer le fil dans votre code, vous devez ajouter la ligne de code suivante

.... 
.... 
ThreadStart newThread = new ThreadStart(delegate { get_Data(dr); }); 
Thread myThread = new Thread(newThread); 
myThread.Start(); 
Questions connexes