2011-12-11 58 views
0

私はページを持っているフレームを持つウィンドウ(メインウィンドウと言う)を持っています。ページのボタンが別のウィンドウを開きます(ポップアップウィンドウなど)。今私はポップアップウィンドウのボタンからメインウィンドウでメソッドを呼び出そうとしています。メソッドはマルチスレッドでなければならない、私はWindowsフォームで実行されている同様のソリューションを持っていたが、多くのUIコンポーネントがWPFでこれを必要とするため、呼び出しスレッドがSTAでなければならない。私たちのメインウィンドウですWINDOW1wpfスレッド、スレッドはSTAである必要があります

モーダルポップアップウィンドウを開くページの方法

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

こちら。 doneDeal方法は、最終的に私は

public void Tickes(object sender, DoWorkEventArgs e) 
     { 

     } 

はまた、私はtickes方法の結果から、GridViewコントロールを移入したいバックグラウンドで実行しようとしています方法は、これはなり

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(); 


     } 

ですバックグラウンドで繰返し実行しますが、グリッドに追加するデータは定期的に返されます。進行更新のイベントでそれを行うべきですか?ディスパッチャーとバックグラウンドワーカーの周りをwpfで包み込むように多くの努力をしましたが、STAアパートの状態を理解できません。誰かが私のティッシュメソッドを得るのを手伝ったり、正しい方向に向いてくれたら、とても感謝しています。

+0

のように宣言されています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方法は、あなたが[アパートメント状態](http://msdn.microsoft.com/en-us/library/を設定しようとしたことがあり、この

[STAThread] 
    public void Tick7(string stock, int rowID, string exchange) 
    { 

     int rowNum = rowID; 
     int counter = -1; 

     deletecounter = StockData.deletecounter; 
     Thread.CurrentThread.Name = StockData.stock; 
     . 
     . 
     . 
    } 
関連する問題