Hello les gens,
Je suis actuellement en train de développer un petit outil pour nos dévs internes en WPF. Technologie que je ne maitrise pas du tout mais que j’ai hâte de décortiquer. Et qui dit WPF, dit Thread (enfin je suppose).
Etant plutôt spécialisé dans le dév d’application web et d’assembly, je ne connais très peu les Threads.
Alors mon problème, c’est que durant un traitement long, et si je n’utilise que le Thread principal qui n’est que celui de l’UI. L’application se fige tant que ce n’est pas finis. Chose vraiment pas top du tout. Donc, hop, je crée un nouveau Thread dédié à ce traitement long. MAIS, malheureusement, elle a besoin d’accéder aux données saisies sur l’interface utilisateur.
Et je ne vois pas comment je peux complètement isoler ce traitement sans dépendre des éléments de l’UI. Donc, j’ai procédé de cette manière en plaçant des :
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, (MethodInvoker)delegate()
{
// Mon bout de traitement long accédant à mes contrôles
});
Dans le nouveau Thread créé spécialement pour mon traitement long.
Alors, c’est nettement mieux, MAIS, l’ordre d’exécution des Threads est bizarre. Quel est le comportement d’un Thread ? A quel moment il s’exécute par rapport au thread principal ? J’ai des bouts de traitements où mes variables sont null alors que justement je leur ai fournit les valeurs juste avant.
Exemple: Ma méthode DoThing est attaché un Thread.
[code]private void btnDoThings_Click(object sender, RoutedEventArgs e)
{
Thread myThread = new Thread(new ThreadStart(DoThings));
myThread.SetApartmentState(ApartmentState.STA);
myThread.Start();
}
private void DoThings()
{
CrmBoolean isDuplicate = CrmBoolean.Null;
bool isAdvancedFind = false;
int restrictionLevel = -1;
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, (MethodInvoker)delegate()
{
ApplicationLoading(true);
isDuplicate = (chkIsDuplicate.IsChecked.Value) ? new CrmBoolean(true) : new CrmBoolean(false);
isAdvancedFind = chkValidForAdvancedFind.IsChecked.Value;
restrictionLevel = cmbRestrictionLevel.SelectedIndex;
});
// Normalement, ma variable isAdvancedFind doit avoir soit true ou false or je n'ai rien.
crmContext.SetDisplayMaskFlag(item, DisplayMasks.ValidForAdvancedFind, isAdvancedFind);
switch (restrictionLevel)
{
case 0:
break;
case 1:
crmContext.SetRequiredLevelFlag(item, AttributeRequiredLevel.None);
break;
case 2:
crmContext.SetRequiredLevelFlag(item, AttributeRequiredLevel.Recommended);
break;
case 3:
crmContext.SetRequiredLevelFlag(item, AttributeRequiredLevel.Required);
break;
default:
break;
}
// ....
}[/code]
Par contre, si vous avez un très bon tuto sur les threads et notamment pour la gestion de la barre de progression vu que je l’utilise aussi.
Voilà, voilà.