Méthodes asynchrones et threads

Fermé
Samy17 - 12 janv. 2013 à 17:24
WarthogDJ Messages postés 202 Date d'inscription dimanche 4 novembre 2007 Statut Membre Dernière intervention 5 septembre 2020 - 20 janv. 2013 à 11:53
Bonjour,

Bonjour à tous,

J'ai un programme qui nécessite un chargement de données relativement lourd et qui prends donc un petit temps (environ 2 minutes). Évidemment, durant ce chargement toute mon appli se retrouve bloquée et je ne peux même plus réduire la fenêtre.

Bref, ce que je voudrai c'est exécuté tout le chargement en fond puis être alerté quand celui-ci est terminé.

Tout d'abord j'essaie de m'en tenir à débloqué l'appli durant l'exécution de cette tâche. En cherchant un peu partout sur le Web, j'ai mis ce code en place :

Code :
Action<object> action = (object obj) =>
{
        Application.Current.Dispatcher.BeginInvoke(new Action(() => { test(); }));
};
 
Task t1 = new Task(action, "alpha");
t1.Start();



Cela ne fonctionne que partiellement car après avoir démarré la Task t1, la fonction dans laquelle ce code se trouve continue de s'exécuter jusqu'à la fin.

Cool Sauf qu'ensuite mon application reste tout de même bloquée...

Merci d'avance pour votre aide

1 réponse

WarthogDJ Messages postés 202 Date d'inscription dimanche 4 novembre 2007 Statut Membre Dernière intervention 5 septembre 2020 8
20 janv. 2013 à 11:53
new Thread(MaMethode).Start();

Autrement tu peux aussi instancier ton thread.

Si tu veux modifier quelque chose sur ta form (pour avertir) il faut utiliser un delegate https://www.microsoft.com/en-us/download/details.aspx?id=55984


namespace CrossThreadDemo
{
	public class Form1 : Form
	{
		// This delegate enables asynchronous calls for setting
		// the text property on a TextBox control.
		delegate void SetTextCallback(string text);

//_____________________________________________
Puis tu écris ta méthode dans ta classe,...
//_____________________________________________
private void SetText(string text)
		{
			// InvokeRequired required compares the thread ID of the
			// calling thread to the thread ID of the creating thread.
			// If these threads are different, it returns true.
			if (this.textBox1.InvokeRequired)
			{	
				SetTextCallback d = new SetTextCallback(SetText);
				this.Invoke(d, new object[] { text });
			}
			else
			{
				this.textBox1.Text = text;
			}
		}



Autre chose tu peut aussi utiliser un tube nommé pour faire communiquer un thread avec un autre.

Pas utile je pense dans ton cas mon bon a savoir.
0