2010-05-19 2 views
2

Je suis très novice en multithreading et manque d'expérience. J'ai besoin de calculer certaines données dans un thread différent afin que l'interface utilisateur ne raccroche pas, puis envoyer les données comme il est traité dans une table sur le formulaire principal. Donc, fondamentalement, l'utilisateur peut travailler avec les données déjà calculées, alors que d'autres données sont encore en cours de traitement. Quel est le meilleur moyen d'y parvenir? Je serais également très reconnaissant pour tous les exemples. Merci d'avance.C# retourne régulièrement les valeurs d'un thread différent

+2

Recherche Stack Overflow pour « BackgroundWorker » cela devrait vous donner beaucoup de questions avec de bonnes réponses. – ChrisF

+2

Ou consultez la [page MSDN BackgroundWorker] (http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx) – ChrisF

Répondre

2

Si vous ne souhaitez pas utiliser le travailleur de base comme une réponse par Kman vous pouvez créer vous-même fil.

private void startJob(object work) { 
    Thread t = new Thread(
     new System.Threading.ParameterizedThreadStart(methodToCall) 
    ); 
    t.IsBackground = true; // if you set this, it will exit if all main threads exit. 
    t.Start(work); // this launches the methodToCall in its own thread. 
} 

private void methodToCall(object work) { 
    // do the stuff you want to do 
    updateGUI(result); 
} 

private void updateGUI(object result) { 
    if (InvokeRequired) { 
     // C# doesn't like cross thread GUI operations, so queue it to the GUI thread 
     Invoke(new Action<object>(updateGUI), result); 
     return; 
    } 
    // now we are "back" in the GUI operational thread. 
    // update any controls you like. 
} 
-1

Vous pouvez envoyer les données à une variable statique, les variables statiques sont partagées entre les threads.

1

Initialiser votre objet travailleur de fond

BackgroundWorker bw = new BackgroundWorker(); 
bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); 

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    // I need to compute some data in a different thread so the UI doesn't hang up 
    // Well! ompute some data here. 
    bw.ReportProgress(percentOfCompletion, yourData) // and then send the data as it is processed 
    // percentOfCompletion-int, yourData-object(ie, you can send anything. it will be boxed) 
} 

private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    // to a table on the main form. So, basically, the user can work with the data that is already computed, while other data is still being processed 
    List<string> yourData = e.UserState as List<string>; // just for eg i've used a List. 
} 

Quelle est la meilleure façon d'y parvenir?

RunWorkerAsync(); //This will trigger the DoWork() method 
+0

Merci @Kate Gregory pour effacer les trucs inutiles :). – Amsakanna

0

clé de Registre à utiliser pour partager les données entre les fils

+0

Un peu en retard sur cette réponse? – Cyral

+0

Les réponses ne sont jamais en retard si elles sont utiles. – mydogisbox

+0

S'il vous plaît, s'il vous plaît, n'essayez pas d'utiliser le registre pour mettre en œuvre la communication entre les threads dans un processus. – reuben

Questions connexes