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
Répondre
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.
}
Extrayez ce BackgroundWorker sample document.
Vous pouvez envoyer les données à une variable statique, les variables statiques sont partagées entre les threads.
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
Merci @Kate Gregory pour effacer les trucs inutiles :). – Amsakanna
clé de Registre à utiliser pour partager les données entre les fils
Un peu en retard sur cette réponse? – Cyral
Les réponses ne sont jamais en retard si elles sont utiles. – mydogisbox
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
- 1. glutPostRedisplay dans un thread différent
- 2. Manipulation d'un thread à partir d'un thread différent
- 3. C# - Renvoie les données du thread ThreadPool au thread principal
- 4. Random.Next retourne toujours les mêmes valeurs
- 5. Querystring ne retourne pas toutes les valeurs
- 6. Retourne différent siteMapNodes pour différents rôles
- 7. Comment créer un tableau de valeurs régulièrement espacées dans MATLAB?
- 8. C# XPathNavigator retourne la chaîne de toutes les valeurs au lieu de valeurs
- 9. machine segfaults régulièrement
- 10. WPF Gui rafraîchir de thread différent
- 11. jQuery AutoComplete - Retourne plusieurs valeurs
- 12. Invoquer à partir de thread différent
- 13. android: InputConnection à partir de thread différent.
- 14. Envoyer un message à un thread différent
- 15. Comment exécuter QTcpSocket dans un thread différent?
- 16. global: whereis_name() retourne un Pid différent de différents terminaux
- 17. mod_rewrite ne fonctionne pas régulièrement
- 18. C# Thread Les paramètres changent pendant l'exécution du thread - pourquoi?
- 19. Enregistrement d'un événement à partir d'un thread différent
- 20. : retourne les valeurs du test sur le fichier/répertoire
- 21. Pouvez-vous relancer une exception .NET sur un thread différent?
- 22. System.IO.Directory.GetFiles retourne un résultat différent que Windows XP Companion Search
- 23. Connexion à un TcpListener sur un thread différent, même processus
- 24. PHP date() retourne des valeurs impaires
- 25. insérer des valeurs avec un délimiteur différent
- 26. Différent entre C et C++
- 27. Signaux/Slot Safe Thread C++
- 28. Rails: utilisez régulièrement HEAD pour vérifier les changements de page
- 29. Le thread appelant ne peut pas accéder à cet objet car un thread différent le possède
- 30. Accès au widget Qt à partir d'un thread différent
Recherche Stack Overflow pour « BackgroundWorker » cela devrait vous donner beaucoup de questions avec de bonnes réponses. – ChrisF
Ou consultez la [page MSDN BackgroundWorker] (http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx) – ChrisF