Exception lors de l'utilisation de FolderBrowserDialog
Je suis l'Exception suivante lorsque vous essayez d'utiliser FolderBrowserDialog:
System.Threading.ThreadStateException: Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it. This exception is only raised if a debugger is attached to the process.
J'ai Googlé ce problème de manière approfondie et les solutions que tout le monde suggère semblent être de mettre [STAThreadAttribute]
au-dessus de la Principale méthode pour supprimer toutes les dll du dossier de Débogage, ou d'utiliser le Invoke
méthode. J'ai essayé toutes ces, et je reçois toujours la même exception.
Voici le code:
public partial class Form1 : Form
{
public event EventHandler ChooseLocationHandler = null;
public string DestFolder
{
set { textBox1.Text = value; }
get { return textBox1.Text; }
}
public Form1()
{
InitializeComponent();
}
private void ChooseLocationButton_Click(object sender, EventArgs e)
{
if (ChooseLocationHandler != null)
ChooseLocationHandler(this, e);
}
}
Et dans mon présentateur est la suivante:
public partial class Presenter
{
Form1 myForm;
public Presenter()
{
myForm = new Form1();
myForm.ChooseLocationHandler += ChooseLocationHandler;
myForm.Show();
}
public void ChooseLocationHandler(object obj, EventArgs e)
{
Form1 sender = (Form1)obj;
FolderBrowserDialog fbd = new FolderBrowserDialog();
fbd.RootFolder = System.Environment.SpecialFolder.MyComputer;
fbd.ShowNewFolderButton = true;
if (fbd.ShowDialog() == DialogResult.Cancel)
return;
sender.DestFolder = fbd.SelectedPath;
}
}
Je suis de l'Exception sur les log.ShowDialog().
Vous devez vous connecter pour publier un commentaire.
Un fil est STA ou MTA, il ne peut pas être spécifié pour une méthode afin de l'attribut doit être présent sur le point d'entrée.
De
STAThreadAttribute
dans MSDN :Si ce code est appelé à partir d'un thread secondaire, vous avez 3 choix :
REMARQUE IMPORTANTE: en cours d'Exécution (comme vous semblez le faire) du Système.De Windows.Les formulaires de code dans un thread MTA est imprudent, certaines fonctionnalités comme les boîtes de dialogue d'ouverture de fichier (pas seulement de dossier) besoin d'un thread MTA de travail.
Changer votre thread secondaire appartement
Si vous créez le fil vous-même (et ne pas utiliser la spécificité de MTA), vous pouvez simplement changer son appartement avant le départ :
Création d'un thread juste pour ça
Si vous n'avez pas le contrôle de la création de thread vous pourriez le faire dans un temporaire fil :
Invoquant dans un autre(STA) thread
Si votre thread principal contiennent également du Système.De Windows.Les formulaires de code que vous pourriez invoquer dans sa boucle de message pour l'exécution de votre code :
La STAThread attribut doit être en face de la principale, pour autant que je sais.
Cela a réglé mon problème.
[STAThread]
static void main()
Juste une question supplémentaire: pourquoi ne peut-microsoft faire des choses simples?
Tentent-ils de dégoût les gens à faire des codes?
Aussi simple comme ci-dessous :
Ajouter la commande
[STAThread]
avant votre méthode principale. Ça y est, il pourrait fonctionner.Maintenant, vérifiez toutes les dll de Référence et de supprimer les dll pas utiliser.
Qui a été incroyable. Je ne l'aurions jamais imaginé ces dll sont à l'origine de ce problème.