我尝试在wpf中显示folderbrowserdialog,但出现此异常


  当前线程必须设置为单线程
  OLE之前的线程单元(STA)模式
  可以打电话。确保您的
  主要功能具有STAThreadAttribute
  标记在上面。仅此例外
  如果调试器连接到,则引发
  过程


我试图在此函数之前添加[STAThread],但没有任何变化,如何解决此异常?

函数是:

private void Save_any_File()
        {
            System.Windows.Forms.FolderBrowserDialog get_location = new System.Windows.Forms.FolderBrowserDialog();
            get_location.ShowDialog();
        }

最佳答案

您的Main()函数已经具有[STAThread]属性,它被埋在WPF的自动生成的代码中。它对Main()方法没有任何影响。它确保WPF应用程序的主线程(又名UI线程)创建一个“单线程单元”。在您的应用程序中的任何代码开始运行之前,这由CLR完成。

STA是UI线程的硬性要求,许多COM组件都需要STA。 STA为不是线程安全的软件提供了安全的家。因此是“单线程”。 OpenFileDialog是这样的一个组件,其他是剪贴板和拖放支持。

以及许多尝试在您的应用程序中找到家的COM组件。对于OpenFileDialog,这些是用于扩展文件夹视图外观的Shell扩展。

长话短说,毫无疑问,问题是您试图在工作线程上显示对话框。没办法使用Dispatcher.BeginInvoke()封送对UI线程的调用。

08-17 14:52