De nouveaux rendus ! Fonctionnement Global | BehindCVK 1/5
mai 26

Un petit point technique concernant l’accès à la ressource d’un même élément par plusieurs Threads tout en évitant le Cross-Thread Access.

Exemple concrêt : l’image qui représente la Touche est la même pour les 105 touches du clavier. Le plugin de défilement automatique (qui est un autre Thread) change cette image pour la faire apparaitre comme illuminée, et ce, pour une sélection de N Touches. Lors de cette opération, il est très probable qu’une exception de type : InvalidOperatioException soit jetée. Ceci est du au fait que le Thread qui essaye d’accéder à l’image n’est pas le même que le thread qui a créé le contrôle.

Voici la méthode utilisée pour régler ce problème :

///Sets the Image by a thread-safe manner.
private void SetImageOut()
{
if ( InvokeRequired ) //Vérifie si l’appelant est un thread différent de celui qui a créé le contrôle

//Dans ce cas, on ré-appelle notre méthode SetImageOut () par le Thread à qui notre contrôle appartient
this.Invoke(new MethodInvoker(delegate() { SetImageOut(); }));

else {
//Si tout est bon, on peut appliquer notre Image au contrôle
if (this.Image == null)
this.Image = _keyNormalImage;

}

}
D’autres exemples sont disponibles sur :

cette page et sur le MSDN

Commenter cet article