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();
Другие вопросы по тегам