2009-09-03 2 views
0

En arrière-plan: Je reçois l'exception suivante dans mon code ci-dessous.Comment différer l'instanciation du formulaire principal jusqu'à ce qu'il réponde à un événement dans une application WinForms?

ThreadStateException: contrôle ActiveX '8856f961-340a-11D0-a96b-00c04fd705a2' ne peut pas être instancié parce que le thread courant n'est pas dans un seul thread.

La méthode Main() est marquée avec l'attribut [STAThread]. L'application est censée démarrer sans fenêtre et écouter un événement provenant d'une bibliothèque de partage de contexte de données tierces. Lorsque eventhandler est déclenché, je voudrais qu'il crée et affiche le formulaire, si ce n'est déjà fait. Le formulaire héberge simplement un contrôle webbrowser. Donc, ma question est comment puis-je retarder l'instanciation de la forme principale (w/webbrowser control) d'une application jusqu'à ce qu'un gestionnaire d'événement soit déclenché?

Dans ce cas, je suppose que je pourrais simplement créer le formulaire depuis le début en le passant au constructeur ApplicationContext, puis le masquer, mais je suis vraiment curieux de savoir pourquoi cela ne fonctionne pas.

[STAThread] 
static void Main() { 
    ListenerAppContext context = new ListenerAppContext(); 
    Application.Run(context); 
} 

...

public class ListenerAppContext : ApplicationContext { 
    ThirdPartyDataContextAdapter adapter; 
    string UrlFormat = "http://ViewDataHere/?{0}"; 

    public ListenerAppContext() { 
    adapter = new ThirdPartyDataContextAdapter(); 
    adapter.OnSomeEvent += new OnSomeEventHandler(adapter_OnSomeEvent); 
    } 

    void adapter_OnSomeEvent(string data) { 
     ShowData(data); 
    } 

    void ShowData(string data) { 
     string url = String.Format(UrlFormat, data); 
     if (this.MainForm == null) { 

      this.MainForm = new ReportViewer(url); // Exception thrown here 
     } else { 
      ((IReportView)this.MainForm).Url = url; 
     } 
    } 

... 
} 

Répondre

2

Vous trouverez peut-être beaucoup plus facile d'aller de l'avant et instancier la principale forme tout de suite, mais le cacher afin que les utilisateurs ne voient pas. Ensuite, vous le rendez visible lorsque vous voulez voir ce qu'il y a dedans.

Questions connexes