打开新窗口作为STAThread

时间:2018-06-08 09:45:14

标签: c# wpf multithreading backgroundworker

我正在使用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 个答案:

答案 0 :(得分:0)

希望我能理解您的问题。如果没有,请随时纠正我。

要从BackgroundWorker_DoWork方法中打开一个新窗口,可以使用注释中提到的Dispatcher:

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

那是我一些工作代码中的一个例子。 employee变量是后台工作程序方法的本地变量,并作为参数发送到EmailEnter构造函数。然后使用.ShowDialog()打开窗口。

我在BackgroundWorker_DoWork方法的末尾调用了此方法。

在您的情况下,您想用ColumnStartSelection替换EmailEnter并将其filePath变量传递给它。

如果您要我澄清任何事情,请告诉我。

答案 1 :(得分:0)

我的解决方案:

我停止使用BackgroundWorker,开始使用aysncawait。 对于我的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;
}