2010-05-31 2 views

Répondre

3

Toutes les boîtes de dialogue de shell, y compris FolderBrowserDialog, requièrent l'appartenance COM pour le thread à définir sur STA. Vous manque probablement l'appel Thread.SetApartmentState():

private void button1_Click(object sender, EventArgs e) { 
     var t = new Thread(() => new FolderBrowserDialog().ShowDialog()); 
     t.IsBackground = true; 
     t.SetApartmentState(ApartmentState.STA); 
     t.Start(); 
    } 

Prenez garde que vous ne pouvez pas définir le propriétaire de la boîte de dialogue, il se perd facilement derrière une fenêtre d'une autre application. Ce qui rend l'affichage de formulaires ou de boîtes de dialogue sur un thread de travail moins qu'une bonne idée.

+0

Super..can Je fais quelque chose comme ceci: Si une exception se produit dans le thread de travail, alors 1. arrêtez le processus, c'est-à-dire le thread 2. Notifiez le thread principal d'une manière ou d'une autre 3. Puis appelez le FolderBrowserDialog à partir du thread principal. ?? Si oui, SVP donnez-moi un indice sur la façon dont cela peut être fait. – Manish

+0

Vous souhaitez afficher une boîte de dialogue de saisie lorsqu'une exception se produit? C'est * très * imprudent. Au moment où l'utilisateur a compris ce que signifie le dialogue, elle aura complètement oublié ce qu'elle a fait pour provoquer l'exception. Utilisez le dossier AppData pour stocker les fichiers journaux. –

2

Je ne sais pas pourquoi vous voulez fais ceci. Sur un thread de travail, toutes les valeurs nécessaires à votre calcul doivent être disponibles. Il ne devrait pas être nécessaire d'interagir avec l'utilisateur pour obtenir plus d'informations.
Peut-être qu'une refonte serait plus utile dans votre cas. Pensez à fournir le dossier sélectionné à votre thread de travail avant de le démarrer.

EDIT (réponse au commentaire):
Si vous voulez faire vous connecter ma réponse est toujours en vigueur. Votre thread de travail doit savoir où enregistrer les exceptions et ne pas commencer à demander à l'utilisateur.
Utilisez-vous un cadre de journalisation? Sinon, jetez un oeil à log4net par exemple. Ici, vous préconfigurez normalement votre journalisation (niveau de journalisation, chemin, format, ...) dans un fichier xml. Il n'y a pas d'interaction de l'utilisateur nécessaire. Bien que l'utilisateur puisse changer le chemin de journalisation (dans le fichier xml).

+0

Je veux enregistrer une exception pendant le processus de thread de travail et pour cela, je dois prendre un chemin de dossier de l'utilisateur. – Manish

+0

Voilà ce que je ne veux pas faire: coder en dur! Je souhaite accorder à l'utilisateur le privilège de spécifier un dossier et de consigner l'exception dans un fichier texte. Oui, j'utilise un cadre de journalisation. – Manish

+0

@Manish: Mais l'écrire dans un fichier xml n'est pas codé en dur ... il peut être facilement changé. Vous pouvez même fournir le chemin dans les options de votre programme ... – tanascius

Questions connexes