2017-03-01 7 views
0

進捗ウィンドウを別のスレッドで表示する必要があります。新しいスレッドでウィンドウを読み込む

Thread loadT = new Thread(new ThreadStart(() => 
{ 
    Loading ldd = new Loading(); 

    ldd.SetContentMessage("Loading..."); 
    ldd.Closed += (s, ec) => 
    Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background); 

    ldd.ShowDialog(); 

})); 
loadT.SetApartmentState(ApartmentState.STA); 

loadT.Start(); 

//do something 

loadT.Abort(); 

しかし、私は、これは正しい方法だとは思わない: これは私がやったものです。私は別のプロセスのためにこのウィンドウを使いたいと思うし、私はまた、他のウィンドウの上にウィンドウを設定したい。どのアプローチが最適ですか? Ty!

+4

メイン/ UIスレッド以外のスレッドでUIのものを使用しないでください。これは基本的なルールです。代わりに、ワーカースレッドからUIスレッドで更新コードを適切に呼び出すことによって、進行状況インジケータを更新します。 –

+0

プランを切り替えてください。あなたの仕事を別のスレッドにプッシュし、メインスレッドでローディングウィンドウを開始/表示/制御します。 – Skintkingle

+0

残念ながら、私はメインスレッドでこの操作を実行する必要があります。私はこの記事(https://strukachev.wordpress.com/2011/01/09/wpf-progress-window-in-separate-thread/)を見つけました。これは良いアプローチですか? –

答えて

1

データと負荷が読み込まれるのを待っているときは、これを逆にする必要があります。

Loading ldd = new Loading(); 
ldd.SetContentMessage("Loading..."); 
ldd.ShowDialog(); 
Thread loadT = new Thread(new ThreadStart() => 
{ 
    //Do stuff here 
}); 
loadT.Start(); 

次に、いくつかのイベントなどを取得して、読み込みウィンドウに更新をポストするか、そのままにしておくことができます。また、Loadingウィンドウ内のスレッドの状態を監視し、スレッドが完了したときにスレッドの状態を閉じたり、スレッドからウィンドウを閉じることもできます。

例として、読み込みを変更してスレッドをパラメータとして使用することができます。

次に、スレッドの開始とスレッドの監視/ウィンドウを読み込みクラスに閉じて、それ自身を見ることができます。

これを行う方法は90万種類あります。また、新しいスレッドを生成する代わりにBackgroundWorkersを使用することも、.Net 4.5以降でasync/awaitを使用することもできます。このようなスレッディングは過去に徹底的に行われており、あなたが取ることを決めるどのような経路であれ、あなたを助けるためのGoogleのリソースがたくさんあるはずです。このことから重要なことは、あなたのウィンドウは本当にUIスレッド上になければならず、読み込みは別のスレッドで行うべきであり、それ以外の方法で行うべきではないということです。

+0

非同期/待機は追加のスレッドを必要としません – VMAtm

0

http://reedcopsey.com/2011/11/28/launching-a-wpf-window-in-a-separate-thread-part-1/という別のスレッドでWPFウィンドウを起動する方法の例については、次のブログ記事を参照してください。

しかし、異なるスレッドで作成されたコントロールを混在させることはできません。コントロールは、最初に作成されたスレッドでしかアクセスできないため、あるスレッドでコントロールを作成してから別のスレッドでコントロールを使用することは意味がありません。スレッドアフィニティのために単純に機能しないためです。

長時間実行されている操作の進行中にスタンドアロンの最上位の読み取り専用ウィンドウを表示しても問題ありませんが、操作が完了するとすぐにこのウィンドウを閉じてください。このウィンドウから別のスレッドで作成された別のコントロールにコントロールを移動することはできません。

関連する問題