【问题标题】:C# WinForms: How to set Main function STAThreadAttributeC# WinForms:如何设置 Main 函数 STAThreadAttribute
【发布时间】:2011-06-16 14:33:27
【问题描述】:

在后台线程中调用saveFileDialog.ShowDialog() 时出现以下异常:

当前线程必须设置为单线程 OLE 之前的线程单元 (STA) 模式 可以拨打电话。确保您的 主函数具有 STAThreadAttribute 标记在上面。

根据this

要解决此问题,请插入 声明:

Threading.Thread.CurrentThread.ApartmentState = Threading.ApartmentState.STA;

在 Main 之前 Application.Run 语句。

但 Application.Run 语句位于 Program.cs 中,这似乎是生成的代码,因此任何更改都可能会意外丢失。另外,我找不到在项目或主窗体属性中将当前线程设置为 STA 的方法,但也许我找错了地方。 在后台线程中调用saveFileDialog.ShowDialog() 的正确方法是什么?

【问题讨论】:

标签: c# winforms


【解决方案1】:

解决方法很简单; 只需将其添加到 Main 方法 [STAThread]

所以你的主要方法应该是这样的

 [STAThread]
 static void Main(string[] args)
 {
     ....
 }

它对我有用。

【讨论】:

    【解决方案2】:

    不应从后台线程调用 ShowDialog() - 使用 Invoke(..)。

    Invoke((Action)(() => { saveFileDialog.ShowDialog() }));
    

    【讨论】:

    • 内森,YDM! 10 年后 - 谢谢。错误信息太误导人了。
    【解决方案3】:

    如果您正在创建调用 showDialog 的线程,这应该可以工作:

    var thread = new Thread(new ParameterizedThreadStart(param => { saveFileDialog.ShowDialog(); }));
     thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
    

    【讨论】:

      【解决方案4】:

      FormLoad上添加以下代码

      private void Form1_Load(object sender, EventArgs e)
      {
          Thread myth;
          myth = new Thread(new System.Threading.ThreadStart(CallSaveDialog)); 
          myth.ApartmentState = ApartmentState.STA;
          myth.Start();
      }
      

      这里CallSaveDialog是一个线程,在这里你可以像这样调用ShowDialog

      void CallSaveDialog(){saveFileDialog.ShowDialog();}
      

      【讨论】:

      • +1,只有一个对我有用的解决方案(从我的 .dll 中的另一个线程调用 ShowDialog())。谢谢。
      • 你能解释一下这是做什么的吗?
      【解决方案5】:

      在您的主窗体上:

      if (this.InvokeRequired) { 
       this.Invoke(saveFileDialog.ShowDialog()); 
      } else { 
       saveFileDialog.ShowDialog(); 
      }
      

      或者,如果您需要从 UI 线程运行其他方法:

        private void DoOnUIThread(MethodInvoker d) {
           if (this.InvokeRequired) { this.Invoke(d); } else { d(); }
        }
      

      然后,这样调用你的方法:

       DoOnUIThread(delegate() {
          saveFileDialog.ShowDialog();
       });
      

      【讨论】:

        猜你喜欢
        • 2016-05-16
        • 1970-01-01
        • 1970-01-01
        • 2020-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-19
        相关资源
        最近更新 更多