2011-12-11 113 views
0

我有一個窗口(說主窗口)與一個框架,其中有一個頁面。頁面上的按鈕打開另一個窗口(比如彈出窗口)。現在我正試圖從彈出窗口中的一個按鈕調用主窗口中的方法。該方法必須是多線程的,我有一個類似的解決方案在Windows窗體中運行,但我一直得到的調用線程必須是STA,因爲許多UI組件需要在WPF中。wpf線程,線程必須是STA

這將打開彈出式窗口模態

Scripts showStocks = new Scripts(); 
      showStocks.ShowInTaskbar = false; 
      showStocks.ShowDialog(); 
      if (showStocks.DialogResult==true) 
      { 
       Window1 wd1 = new Window1(); 
       wd1.doneDeal(); 
      } 

下面窗口1是我們的主窗口中的頁面上的方法。該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

你有沒有嘗試設置[公寓狀態(http://msdn.microsoft.com/en-us/library/ system.threading.apartmentstate%28v = vs.71%29.aspx)直接?我認爲這應該通過'Thread'類來完成,它可能在'BackgroundWorker'中不可用 – oleksii

回答

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; 
     . 
     . 
     . 
    } 
相關問題