2017-01-25 7 views
0

メインウィンドウのレンダリング時にgifをロードしてウィンドウを作成する必要があります。私はいくつかの記事を読んで、この目的のために私は新しいスレッドを作成する必要があるという決定を下す。WPF別のSTAスレッドのレクリエーションウィンドウ

LoadingDialog _loadingDlg; 
Thread loadingThread; 

public void ShowLoading() 
{ 
    loadingThread = new Thread(new ThreadStart(loadingThreadWork)); 
    loadingThread.SetApartmentState(ApartmentState.STA); 
    loadingThread.Start(); 
} 

private void loadingThreadWork() 
{ 
    _loadingDlg = new LoadingDialog(); 
    _loadingDlg.Show(); 
    System.Windows.Threading.Dispatcher.Run(); 
} 

public void HideLoading() 
{ 
    _loadingDlg.Dispatcher.InvokeShutdown(); 
} 

私は私がしたいようShowLoading()、その後HideLoading()すべての作品を呼び出し初回:私はそのような何かを持っている結果this article

のようにそれをやりました。私は2回目にShowLoading()を呼び出すときしかし、私はメッセージThe calling thread cannot access this object because a different thread owns it

_loadingDlg.Show(); 

で例外を取得します。

これはどのようにすることができますか? _loadingDlgは、前の行と同じスレッドで作成されます。

+0

なぜ新しいウィンドウを作成しますか?中心に置かれたグリッドを作成するだけでなく、表示の切り替えもできます。 –

答えて

0

loadingThreadWorkでは、最初に実行する前にコントロールを作成しています(null)ので、初めて成功します。ただし、コントロールの所有者としてマークされている別のスレッドでダイアログを作成しています。

次にloadingThreadWorkを呼び出すと、コントロールはnullではなく、別のスレッドから変更されます(別のスレッドであるため、再度作成するため例外が発生します)。あなたは持っている。

WPFを使用している場合は、スレッドからasync操作に切り替える必要があります。これは、現在のソリューションよりも読みやすく、サポートしやすく、予測可能です。

+0

ありがとうございます。あなたの言葉で、私は自分の問題を解決する方法を見つけました。所有者がクラスのために決定されているのは正しいのですが、そうではありませんか?私はこれについてもっと詳しく読むことができるときに、いくつかの記事を出すことができますか? –

+0

いいえ、所有者はインスタンスによって決まります。メッセージエラーで検索することができますが、これは一般的なエラーです。 – VMAtm

+0

しかし、新しいスレッドでインスタンスを再作成しました。この後、私は例外を取得します。 –

関連する問題