2012-01-25 20 views
2

Iveはwpfフォームを取得しています。これは、ユーザーがコントロールから選択するとすぐに読み込みポップアップを表示したいからです。データベースがローカルではないので、長い時間がかかります。私はポップアップウィンドウのスレッドを作成する場所まで、すべての作業を完了しました。親Freezableとは別のスレッドに属しているDependencyObjectを使用できません

私は私のスレッドを作成する場所です:

public void Start() 
    { 

     if (_parent != null) 
      _parent.IsEnabled = false; 

     _thread = new Thread(RunThread); 

     _thread.IsBackground = true; 
     _thread.SetApartmentState(ApartmentState.STA); 
     _thread.Start(); 

     _threadStarted = true; 
     SetProgressMaxValue(10); 

     Thread th = new Thread(UpdateProgressBar); 
     th.IsBackground = true; 
     th.SetApartmentState(ApartmentState.STA); 
     th.Start(); 
    } 

とスレッド方法:

private void RunThread() 
    { 

     _window = new WindowBusyPopup(IsCancellable); 
     _window.Closed += new EventHandler(WaitingWindowClosed); 
     _window.ShowDialog(); 
    } 

私はこのエラーを取得する実行した瞬間:

は使用できません親のFreezableとは異なるスレッドに属するDependencyObject

任意の助けいただければ幸い:)

+0

使用を呼び出しの代わりに(私が見るように、あなたは、関数UpdateProgressBarの実装を示してはいけません)。 –

+0

私はスレッドを作成する代わりに起動しようとしましたが、うまくいきませんでした。どのように私は呼び出しを使用することを提案しますか? – user1168738

答えて

0

は、フォームのディスパッチャプロパティを使用してみてください。 Dispatcher.BeginInvoke(...)

また、進捗率を報告するReportProgress()というメソッドがあるため、BackgroundWorkerクラスを使用してください。プログレスバーなどの値をリフレッシュできるときにProgressChangedイベントが発生します。

0

親Freezableとは異なるスレッドに属するDependencyObjectは使用できません。

このエラーは、(あなたがポップアップウィンドウを表示するために使用している)STAスレッドの別のスレッドで作成されたリソース(タイプUIElement)を使用しようとしているために発生します。

あなたの場合は、2番目のスレッドのように見えます。スレッドth =新しいスレッド(UpdateProgressBar);は、WindowBusyPopupでUIを操作しようとしています。ポップアップが別のスレッドによって所有されているので、この例外が発生しています。

可能な解決策は:

private void UpdateProgressBar() 
{ 
if(_window != null) /* assuming you declared your window in a scope accesible to this function */ 
_window.Dispatcher.BeginInvoke(new Action(() => { 
// write any code to handle children of window here 
})); 
} 
関連する問題