【问题标题】:ThreadStateException on OpenFileDialog with No Threads没有线程的 OpenFileDialog 上的 ThreadStateException
【发布时间】:2017-02-16 01:51:36
【问题描述】:

所以这很奇怪。我有一个简单的表格来测试其他代码。它曾经可以工作,但是在添加了一些 Fakes 程序集(尝试为单元测试自动生成数据)之后,我的代码在 ShowDialog 上以 ThreadStateException 停止。我没有多线程,甚至没有使用任何非样板代码。搜索没有帮助,因为唯一的解决方案应该是使用已经完成的STAThread 属性进行标记。再说一遍,以前的代码可以正常工作,除了 Fakes 之外,项目配置没有任何变化。

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

下面的ShowDialog 发生异常。

    private void button1_Click(object sender, EventArgs e)
    {
        using(var fod = new OpenFileDialog())
        {
            if(fod.ShowDialog()==System.Windows.Forms.DialogResult.OK)
            {
                runTest(fod.FileName );
            }
        }
    }

编辑: 我在Main 中添加了一个断点来检查System.Threading.Thread.CurrentThread.GetApartmentState(),它正在返回MTA,所以看起来STAThread 属性被忽略了。我认为您无法更改正在运行的线程的单元,所以我很茫然。

【问题讨论】:

  • 这不是罕见的事故。您需要发布输出窗口的内容以获得帮助。
  • @HansPassant,我的输出和立即窗口是空白的,没有调试信息。
  • 还发现了一个类似的未回答问题,stackoverflow.com/questions/11560479/…

标签: c# .net openfiledialog microsoft-fakes


【解决方案1】:

我修复了它,这是一个相当愚蠢的项目配置错误。

我有一个对另一个测试项目的项目引用(对于我需要填充的数据)。出于系统配置的原因,我不想进入,这两个项目都有相同的程序集名称。我在尝试通过创建自己的应用程序线程来解决问题时发现了这一点,然后遇到了其他类型的加载异常。我移动了这些类,因此程序集不必相互引用。

我不知道为什么会导致主线程被创建为 MTA,但确实如此。任何见解将不胜感激。

为了完整起见,这是我不需要的解决方法,

        var runapp = new System.Threading.ThreadStart(() =>
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            });

        var thread = new System.Threading.Thread(runapp);
        thread.SetApartmentState(System.Threading.ApartmentState.STA);
        thread.Start();
        thread.Join();

【讨论】:

  • @Downvoter,哎哟。我知道这是一个愚蠢的错误,但答案真的值得一票否决吗?
  • 我也有同样的问题,这个解决方法不行。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多