我正在使用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;
}
答案 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
,开始使用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;
}