没有线程的 OpenFileDialog 上的 ThreadStateException
ThreadStateException on OpenFileDialog with No Threads
所以这很奇怪。我有一个简单的表格来测试其他代码。它曾经有效,但在添加了一些 Fakes 程序集(尝试为单元测试自动生成数据)后,我的代码在 ShowDialog
上以 ThreadStateException
停止。我没有多线程,甚至没有使用任何非样板代码。搜索没有帮助,因为唯一的解决方案应该是使用已经完成的 STAThread
属性进行标记。再一次,代码过去工作正常,除了假货外,项目配置没有变化。
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
属性似乎被忽略了。我不认为你可以更改 运行 线程的单元,所以我很茫然。
我修复了它,这是一个相当愚蠢的项目配置错误。
我有一个项目引用到另一个测试项目(用于我需要填充的数据)。出于系统配置的原因,我不想深入探讨,这两个项目都具有相同的程序集名称。我发现了这一点,因为我试图通过创建自己的应用程序线程来解决问题,然后 运行 进入其他类型的加载异常。我移动了 类 这样程序集就不必相互引用了。
我不知道为什么这导致主线程被创建为 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();
所以这很奇怪。我有一个简单的表格来测试其他代码。它曾经有效,但在添加了一些 Fakes 程序集(尝试为单元测试自动生成数据)后,我的代码在 ShowDialog
上以 ThreadStateException
停止。我没有多线程,甚至没有使用任何非样板代码。搜索没有帮助,因为唯一的解决方案应该是使用已经完成的 STAThread
属性进行标记。再一次,代码过去工作正常,除了假货外,项目配置没有变化。
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
属性似乎被忽略了。我不认为你可以更改 运行 线程的单元,所以我很茫然。
我修复了它,这是一个相当愚蠢的项目配置错误。
我有一个项目引用到另一个测试项目(用于我需要填充的数据)。出于系统配置的原因,我不想深入探讨,这两个项目都具有相同的程序集名称。我发现了这一点,因为我试图通过创建自己的应用程序线程来解决问题,然后 运行 进入其他类型的加载异常。我移动了 类 这样程序集就不必相互引用了。
我不知道为什么这导致主线程被创建为 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();