2012-12-17 7 views
2

Je reçois un InvalidOperationException avec le message Cross-thread operation not valid..InvalidOperationException au sein BeginInvoke

Le _waitForm est créé dans le constructeur de la principale forme. La méthode dans la capture d'écran est appelée à partir d'un autre thread. Je pense que c'est ce que BeginInvoke résout. Je sais que j'accède au formulaire à partir d'un autre fil que celui créé. Des idées pour résoudre ce problème?

enter image description here

Voici le stacktrace:

at System.Windows.Forms.Control.get_Handle() 
    at System.Windows.Forms.Control.get_ContainsFocus() 
    at System.Windows.Forms.Control.SelectNextIfFocused() 
    at System.Windows.Forms.Control.SetVisibleCore(Boolean value) 
    at System.Windows.Forms.Form.SetVisibleCore(Boolean value) 
    at System.Windows.Forms.Control.Hide() 
    at YYYYYY.Boundary.ZzzzzForm.<HideWaitForm>b__c() in R:\Projects\XXXX\trunk\src\YYYYYY\Boundary\ZzzzzForm.cs:line 514 
    at System.Windows.Forms.Control.InvokeMarshaledCallbackDo(ThreadMethodEntry tme) 
    at System.Windows.Forms.Control.InvokeMarshaledCallbackHelper(Object obj) 
    at System.Threading.ExecutionContext.runTryCode(Object userData) 
    at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) 
    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Windows.Forms.Control.InvokeMarshaledCallback(ThreadMethodEntry tme) 
    at System.Windows.Forms.Control.InvokeMarshaledCallbacks() 

désolé pour la capture d'écran, je voulais montrer toute l'image

+0

Si vous voulez attendre la fin de l'appel, vous devez simplement appeler le 'Invoke()' synchrone. – SLaks

+0

Quelle est la trace de la pile? – SLaks

+0

Avez-vous deux threads d'interface utilisateur? – SLaks

Répondre

3

Avez-vous essayé de fonctionner sur _waitForm par:

_waitForm.Invoke(new MethodInvoker(_waitForm.Hide)); 

Sinon, si ce qui précède ne fonctionne pas:

_waitForm.Invoke(new MethodInvoker(() => 
{ 
    _waitForm.Reset(); 
    _waitForm.Hide(); 
})); 
+0

Oui. Vous devez appeler un code qui exploite le contrôle avec le répartiteur de ce contrôle. – lavrik

+0

Cela provoque un blocage. Si j'utilise à la place Begin/End Invoke l'exécution des blocs EndInvoke – Odys

0

Je l'ai trouvé. Bien sûr, c'était mon erreur! L'inverse de cette méthode est celui qui montre le _waitForm. J'avais par erreur appelé _waitForm.Show() d'un autre que le thread UI sans invocation. Étrangement, cela a réussi et a provoqué cette exception (qui a le mauvais message).