2009-09-28 3 views
3

Je suis en train d'accéder à une forme d'un fil différent de celui sur lequel la forme a été créée, et a finalement terminé avec une erreur:Obtenir le fonctionnement inter-threads pas valable dans SetWindowPos()

Cross thread operation not valid

code :

public static void MakeTopMost(Form form) 
{ 
    SetWindowPos(form.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS); 
} 

Je passe un formulaire qui s'exécute dans un autre thread. J'ai essayé de tester InvokeRequired, mais c'est toujours faux.

Je suis novice dans le domaine du filetage.

+0

duplication possible de [Opération croisée non valide] (http://stackoverflow.com/questions/5037470/cross-thread-operation-not-valid) – abatishchev

Répondre

13

Assurez-vous que vous testez le bon objet pour InvokeRequired:

public static void MakeTopMost(Form form) 
{ 
    if (form.InvokeRequired) 
    { 
     form.Invoke((Action)delegate { MakeTopMost(form); }); 
     return; 
    } 

    SetWindowPos(form.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS); 
} 

J'aime envelopper tout cela avec une méthode d'extension comme ceci:

public static class SynchronizeInvokeUtil 
{ 
    public static void SafeInvoke(this ISynchroniseInvoke sync, Action action) 
    { 
     if (sync.InvokeRequired) 
      sync.Invoke(action); 
     else 
      action(); 
    } 

    public static void SafeBeginInvoke(this ISynchroniseInvoke sync, 
             Action action) 
    { 
     if (sync.InvokeRequired) 
      sync.BeginInvoke(action); 
     else 
      action(); 
    } 
} 

Vous pouvez simplement appeler:

form.SafeInvoke(() => SetWindowPos(form.Handle, HWND_TOPMOST, 
            0, 0, 0, 0, TOPMOST_FLAGS)); 

Ce qui est probablement le plus lisible.

Notez que si vous utilisez ceci dans la classe de formulaire elle-même, vous devez utiliser this.SafeInvoke(...) pour accéder à la méthode d'extension.

+0

@Drew Noakes, il n'y a pas d'erreur dans le thread croisé opération, mais toujours pas de fruits. Ce n'est pas ma forme à l'avant. – Anuya

+0

@karthik - si vous ne pouvez pas obtenir le formulaire à l'avant, avoir une autre recherche sur SO (je suis sûr qu'il y a beaucoup de questions à ce sujet ici). Si cela ne vous aide pas, posez une nouvelle question. –

Questions connexes