Le client et le serveur de mon programme sont marqués STAThread et j'ai vérifié dans le débogueur que le thread à partir duquel je fais l'appel est marqué comme STA. Du côté du serveur, j'ai vérifié que le programme lui-même lors de la configuration du serveur est marqué STA. Cependant, l'appel réel .Net remoting est effectué via un thread qui est marqué MTA. Est-il de toute façon pour modifier ce comportement que ma méthode de service accède aux ressources qui nécessitent un thread STA.Comment définir l'état de l'appartement du thread desservant l'appel .Net Remoting?
Répondre
Remoting ne peut pas faire cela, une exigence forte pour un thread STA est qu'il pompe également une boucle de message. Vous devrez en effet créer votre propre thread, utilisez Thread.SetApartmentState() pour le basculer sur STA avant vous le démarrez. Et utilisez Application.Run() avec un formulaire factice pour démarrer la boucle de message. Vous pouvez ensuite utiliser Control.BeginInvoke() pour rassembler l'appel du thread distant à ce nouveau thread. Notez que puisque vous avez déjà démarré un thread STA pour le serveur, ce thread ferait très bien le travail. Coller dans votre classe de formulaire pour l'empêcher d'obtenir visible:
protected override void SetVisibleCore(bool value) {
if (!this.IsHandleCreated) {
this.CreateHandle();
value = false;
}
base.SetVisibleCore(value);
}
Vous pouvez créer un autre thread et le marquer comme STA pour lire les ressources. Je suppose qu'il ne va pas être utilisé pour accéder aux objets COM et ainsi de suite. Dans ce cas, cela devrait être correct, mais il y a un surcoût de création de ce thread supplémentaire.
J'ai essayé, et il omet de définir l'état de l'appartement sur le fil que j'ai créé. – esac
J'ai essayé, sauf si je me trompe. Dans la partie principale de mon programme qui est décorée avec [STAThread] j'ai exécuté Application.Run (dummyForm); sur le formulaire fictif que j'ai créé avec votre override ci-dessus. Ensuite, j'ai créé une méthode stub comme LaunchViaMainThread (action Action) {Program.DummyForm.BeginInvoke (action); } Je l'appelle bien sûr via myProxyInstance.LaunchViaMainThread (myProxyInstance.Run); de mon client. Je vois toujours le fil comme marqué comme MTA quand j'entre dans myProxyInstance.Run. – esac
Je ne sais pas, devrait fonctionner, bien sûr. Ajoutez un peu de journalisation, affichez ManagedId de Thread.CurrentThread et GetApartmentState() dans le thread principal et le rappel invoqué. –
Et vérifiez que Program.DummyForm.InvokeRequired a la valeur true. –