【问题标题】:STA error in winform tool in c#c#中winform工具中的STA错误
【发布时间】:2013-01-30 00:46:39
【问题描述】:

我正在获取“当前线程必须设置为单线程单元 (STA) 模式,然后才能进行 OLE 调用。确保您的 Main 函数上标记了 STAThreadAttribute。仅当调试器附加到进程时才会引发此异常“ 错误。下面是代码。

if (externalButton.Checked == true)
{
    // int i = 1;
    saveFileDialog.Title = "Save the Proofer Report";
    saveFileDialog.Filter = "Document Files (*.doc)|*.doc|Document Files        (*.docx)|*.docx";
     saveFileDialog.FilterIndex = 0;
     saveFileDialog.InitialDirectory = "MyDocuments";
     saveFileDialog.FileName = "Proofer Report -- " +  Path.GetFileName((string)fileName) + ".doc";
     //i.tostring()
     saveFileDialog.DefaultExt = ".doc"; 

     saveFileDialog.ShowHelp = true;
     saveFileDialog.ShowDialog();-----getting the error here
     fname = saveFileDialog.FileName;
  }
  else
  {
     fname =(string)fileName;              
  }
  if (fname != "")
  {               
     if (worker.CancellationPending == true)
     {
        // report progress
        worker.ReportProgress(25);
        return;

}

程序.cs

     [STAthread]
static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());

    }

【问题讨论】:

  • 哪一行引发了这个错误?
  • 您是否确保您的 Main 函数上标记了 STAThreadAttribute
  • 您是否要在后台线程上显示对话框?
  • 请参阅我回答中的第二点。不要在后台线程上做 UI 的事情。这是可能的,但是……不。您的模态对话框仍然会发送窗口消息,并且您仍然可以在线程上运行非 UI 的东西。
  • 我明白很多...我曾经在 Web 应用程序中编码时遵循相同...所以这个错误...我该怎么办?

标签: c# winforms openfiledialog


【解决方案1】:

解决方案 1

在 Main 方法上方使用 STAThread

[STAThread]
static void Main(string[] args)

{

}

解决方案 2

如果解决方案不起作用,请清洁您的解决方案。还要交叉检查所有 dll 是否真的被删除。转到您的调试文件夹并从那里删除任何旧的/陈旧的dll。然后再次重建您的解决方案,现在一切都应该好了。

我的经验表明....大多数情况下,解决方案 2 都可以正常工作。

【讨论】:

  • -1 代码在后台线程上。 COM 线程模型是按线程设置的。
  • 我在调试文件夹中没有任何 dll
  • 我要求交叉检查...如果有的话。尝试清理您的解决方案
  • 将 STAThreadAttribute 放在 Main 上使用单线程单元模型为主线程初始化 COM。这对其他线程的线程模型没有影响。
  • Okey.....我对线程不太满意。而且我仍然不明白我的概念在我的回答中哪里出错了。当我在这种情况下运行时,大部分时间我都会清理我的调试文件夹并且一切正常。所以只分享了。不过,感谢您的帮助。
【解决方案2】:

确保您的Main 函数上标有STAThreadAttribute

或者,如果您在另一个线程上运行您的 UI 代码,请使用某种机制在主线程上调用它(例如 BeginInvoke)。

至于为什么保存文件对话框需要单线程单元模型背后的技术原因,它源于使用 Windows Shell 的通用文件对话框。第三方扩展可以在这里加载,他们期望单线程单元线程模型。

ShellExecuteRemarks 部分包含有关此要求的一些很好的信息,尽管它是为 C++ 开发人员编写的。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-06-25
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多