OpenFileDialog和线程问题

时间:2013-08-28 22:01:42

标签: vb.net multithreading visual-studio-2012

我刚刚从VS 2005升级到VS 2012.这是一个我不明白的新问题。我正在使用VS自动创建的默认“Form1”类。我添加了一个按钮来打开文件打开对话框,当我单击按钮时出现此错误:

  

必须先将当前线程设置为单线程单元(STA)模式,然后才能进行OLE调用。确保您的Main函数标记了STAThreadAttribute。仅当调试器附加到进程时才会引发此异常>

我已将“添加到公共类Form1:

<STAThread()> Public Class Form1

但我明白了......

  

属性'STAThreadAttribute'不能应用于'Form1',因为该属性在此声明类型上不是&gt;有效。

我已搜索过但得到一些信息告诉我,我需要将入口点(我相信Form1)设置为单线程属性,但上面的代码不起作用。

如何?

1 个答案:

答案 0 :(得分:4)

<STAThread()>属性无法添加到表单之类的类中。只有 才能应用于Main函数,这是应用程序的入口点。

但是VB.NET隐藏了这个功能,因为很少需要在WinForms应用程序中弄乱Main。只需要为您的应用程序设置管道,编译器可以为您管理。这由项目选项中的“应用程序框架”复选框控制。如果选中此选项,编译器将自动生成Main函数和所需的管道。你可以禁用这个选项,但是对于普通的WinForms开发人员来说,这会让生活变得更加困难,因为你必须编写和维护自己的Main函数。

这里真正的问题是为什么这是一个问题。 WinForms应用程序的编译器生成的Main函数总是会应用STAThread属性。这就是WinForms框架的运行方式。如果没有发生这种情况,那么您的项目就会出现严重错误。我建议废弃它并开始让Visual Studio从其中一个内置模板创建一个新的WinForms项目。一切都应该Just Work™。

另一个选择当然是你试图在一个单独的线程(主UI线程除外)上显示OpenFileDialog。但是根据你在问题中的描述(在窗体中添加一个按钮来显示对话框),听起来并非如此。无论如何,解决方案不是这样做的。例如,如果您使用BackgroundWorker在非UI线程上工作以保持UI响应,那就太好了,但是您需要执行所有UI内容,例如显示{ 调用OpenFileDialog之前的主UI线程上的{1}}。 使用BackgroundWorker函数设置特定线程的公寓状态的方法,但我真的不建议在后台线程上显示SetApartmentState