没有线程的OpenFileDialog的ThreadStateException

本文关键字:OpenFileDialog ThreadStateException 线程 | 更新日期: 2023-09-27 18:13:21

所以这是一个奇怪的。我有一个简单的形式做测试对其他代码。它曾经可以工作,但是在添加了一些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属性被忽略了。我不认为你可以改变一个正在运行的线程的公寓,所以我很困惑。

没有线程的OpenFileDialog的ThreadStateException

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

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

我不知道为什么这会导致主线程被创建为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();