Открыть новое окно как STAThread

Я использую BackGroundWorker получить доступ к некоторым данным и прочитать их. Но мне нужно открыть новое окно wpf внутри кода, который читает данные. (synchronous)

Когда я делаю это, я получаю ошибку.

Я пытался добавить [STAThread] выше функций, которые открывают новое окно, но это не работает.

Метод, который открывает новое окно:

[STAThread]
int returnColumnStartSelection(string filePath)
{
    ColumnStartSelection css = new ColumnStartSelection(filePath);
    css.ShowDialog();
    return css.lineStart;
}

Точка входа в новое окно:

public ColumnStartSelection(string filePath)
{
    InitializeComponent();
    //
    this.Topmost = true;
    this.WindowStartupLocation = WindowStartupLocation.CenterScreen;
}

2 ответа

Решение

Мое решение:

Я перестал пользоваться BackgroundWorker и начал использовать aysnc а также await, Для меня STAThread Проблема Я строю новый метод, который создает новый STAThread, а другой поток просто ждет, пока значение не изменится.

string selectTable(myDataTable dt)
{
    string column = null;
    Thread thread = new Thread(() =>
    {
        TableSelection ts = new TableSelection(dt);
        ts.ShowDialog();
        column = ts.column;
    });
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();

    while (column == null)
    {
        Thread.Sleep(50);
    }
    try { thread.Abort(); } catch { }

    return column;
}

Надеюсь, я понимаю ваш вопрос. Если нет, не стесняйтесь поправлять меня.

Чтобы открыть новое окно из метода BackgroundWorker_DoWork, вы можете использовать Диспетчер, как указано в комментариях:

Application.Current.Dispatcher.Invoke((Action)delegate
        {
            EmailEnter emailer = new EmailEnter("Transfer", employee);
            emailer.ShowDialog();
        });

Это пример из моего рабочего кода. Переменная employee является локальной для фонового рабочего метода и отправляется конструктору EmailEnter в качестве параметра. Затем окно открывается с помощью.ShowDialog().

Я назвал это в конце моего метода BackgroundWorker_DoWork.

В вашем случае вы захотите заменить EmailEnter на ColumnStartSelection и передать ему переменную filePath.

Пожалуйста, дайте мне знать, если вы хотите, чтобы я что-то прояснил.

Другие вопросы по тегам