我有一个窗口(比如主窗口),框架里面有一个页面。页面上的按钮打开另一个窗口(比如弹出窗口)。现在我尝试从弹出窗口上的按钮调用主窗口中的方法。该方法必须是多线程的,我有一个类似的解决方案在Windows窗体中运行但我不断得到调用线程必须是STA,因为许多UI组件在WPF中需要这个。
页面上以模态方式打开弹出窗口的方法
Scripts showStocks = new Scripts();
showStocks.ShowInTaskbar = false;
showStocks.ShowDialog();
if (showStocks.DialogResult==true)
{
Window1 wd1 = new Window1();
wd1.doneDeal();
}
这里window1是我们的主窗口。 doneDeal方法是
public void doneDeal()
{
// **Some Code**
BackgroundWorker wworks1 = new BackgroundWorker();
wworks1.DoWork += Tickes;
wworks1.RunWorkerCompleted += Tickes2;
wworks1.RunWorkerAsync();
// Page1 pg1 = frame1.Content as Page1;
//NextPrimeDelegate dd=new NextPrimeDelegate(okreport);
// pg1.addScriptBtn.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
// new NextPrimeDelegate(okreport));
//startStopButton.Dispatcher.BeginInvoke(
// DispatcherPriority.Normal,
// new NextPrimeDelegate(CheckNextNumber));
//new Thread(() => Tick(stock, rowID, exchange)) { IsBackground = false }.Start();
}
最后我尝试在后台运行的方法
public void Tickes(object sender, DoWorkEventArgs e)
{
}
另外,我想从tickes方法的结果中填充gridview,这将在后台循环并反复运行,但会定期返回要添加到网格中的数据。我应该在进度更新活动中这样做吗?我已经尝试了很多东西绕着wpf的调度员和后台工作者,但我没有理解STA公寓状态位。如果有人可以帮助我使用我的方法或指向正确的方向,我会非常感激。
答案 0 :(得分:0)
好吧,我终于能够解决STA线程问题了,以防万一有人在将来遇到类似的问题。
public void doneDeal()
{
if (StockData.flag == 1)
{
row1 = table.NewRow();
row1[col1] = "";
row1[col2] = "";
row1[col3] = "";
row1[col4] = "";
row1[col5] = "";
row1[col6] = "";
row1[col7] = "";
row1[col8] = "";
row1[col9] = "";
row1[col10] = "";
row1[col11] = "";
row1[col12] = "";
table.Rows.Add(row1);
string stock = StockData.stock;
int rowID = (table.Rows.Count - 1);
string exchange = StockData.exchange;
Thread bh = new Thread(delegate()
{
Tick7(stock, rowID, exchange);
});
bh.SetApartmentState(ApartmentState.STA);
bh.IsBackground = true;
bh.Start();
StockData.flag = -1;
}
}
正在调用的Tick7方法声明为
[STAThread]
public void Tick7(string stock, int rowID, string exchange)
{
int rowNum = rowID;
int counter = -1;
deletecounter = StockData.deletecounter;
Thread.CurrentThread.Name = StockData.stock;
.
.
.
}