ThreadStateException для OpenFileDialog без потоков
Так что это странный. У меня есть простая форма для тестирования другого кода. Раньше он работал, но после добавления некоторых сборок Fakes (пытаясь автоматизировать генерацию данных для модульных тестов), мой код останавливается с ThreadStateException
на ShowDialog
, Никакой многопоточности с моей стороны, даже не сделал это ни к какому не кодовому листу. Поиск бесполезен, так как предполагается, что единственным решением будет пометка 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
атрибут игнорируется. Я не думаю, что вы можете изменить квартиру бегущей нитью, поэтому я в растерянности.
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();