2011-10-27 6 views
1

私はタブページをベースにしたアプリケーションを持っています。起動時間を短縮するために、私はユーザーに表示されるタブページのみを作成しています。ワープフォームのメインUIスレッドにワーカースレッドからUserControlを追加する際にクロススレッド違反が発生する

フォームを起動した後、BackgroundWorkerを使用して他のタブページを作成しました。タブページには、データバインディングを持つユーザーコントロールが含まれています。

正常に動作しています。問題は次のとおりです。1つのタブページで、クロススレッド違反が発生しています。そのタブページにもデータバインディングがあります。

このシナリオでは何が問題になりますか?

ありがとうございます。

答えて

3

WinFormsコントロールにはスレッド親和性があります。これは彼らが作成されたのと同じ魔法使いにアクセスする必要があることを意味します。これは、WinFormsは実際にはWin32の機能を包むラッパーであり、Win32のウィンドウと子コントロールを管理するコードはスレッドセーフではないからです。したがって、フォームと子コントロールは、作成された同じスレッドでのみアクセスする必要があります。

あなたのケースでは、BackgroundWorkerスレッドを使用してTabPageインスタンスを作成してはいけません。実際には、ページを追加するTabControlを含むメインフォームがあると仮定したメインスレッド以外のスレッドです。

多くの場合、開発者は幸運にも、作成された異なるスレッドでコントロールを使用することができ、クラッシュすることはありません。しかし、これは単なる純粋な運であり、遅かれ早かれそれが失敗し始めるでしょう。

+0

私のアプリケーションでパフォーマンスを向上させる方法がある場合。起動時間を短縮するために、別のスレッドでusercontrolを作成してメインスレッドに追加しています。もしそれが純粋な運であれば、BackgroundWorkerを使わずにパフォーマンスを向上させる方法は? – Syed

+2

タブページの作成はパフォーマンス上の問題にはなりません。いくつかのコントロールを備えたページを非常に素早く作成することができます。実際のパフォーマンスのボトルネックを確認する必要があります。読み込んでいるデータですか?非同期にできる同期アクション? –

関連する問題