2

私は WPF (およびコンピューター サイエンス全般) に不慣れで、上司から小さなプロジェクトを与えられました。ここには、それぞれが異なるサイトに移動する 5 つのタブがあります。ログイン後、ユーザーは最初のタブの Web サイトに誘導されます。バックグラウンドでは、他の 4 つのタブがバックグラウンドで読み込まれているはずです。

それぞれに「tabItem1」、「tabItem2」、「tabItem3」、「tabItem4」から「tabItem5」までの名前があります。それぞれの中に「webBrowser5」まであります。

バックグラウンドでページを読み込むにはスレッドを使用する必要があると思いますが、実装方法がわかりません。MainWindow に次のような 4 つの異なるスレッドを作成してみました。

public MainWindow()
{
     InitializeComponent();

     Thread thread1 = new Thread(Update1);
     thread1.SetApartmentState(ApartmentState.STA);
     thread1.Start();

     Thread thread2 = new Thread(Update2);
     thread2.SetApartmentState(ApartmentState.STA);
     thread2.Start();

     Thread thread3 = new Thread(Update3);
     thread3.SetApartmentState(ApartmentState.STA);
     thread3.Start();

     Thread thread4 = new Thread(Update4);
     thread4.SetApartmentState(ApartmentState.STA);
     thread4.Start();
}

private void Update1()
    {
      this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
          (ThreadStart)delegate()
              {
                tabItem2.Focus();
              }
          );
    }

private void Update2()
    {
      this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
          (ThreadStart)delegate()
              {
                tabItem3.Focus();
              }
          );
    }

//...Goes up to Update4

これは最後のスレッドにのみ焦点を当てているようで、バックグラウンドではありません。ガイダンスとヘルプに感謝します。ありがとう!

4

2 に答える 2

1

これは、ディスパッチャがメイン スレッドで動作していることです。オブジェクトがメイン スレッド上にあるため、メイン スレッドにフォーカスを設定するように指示しました。

問題:

答えは、なぜこれをしなければならないかにあります。作成されたスレッド以外のスレッドで Windows コントロールを操作することはできません。また、あるスレッドでコントロールを作成し、それを別のスレッドでコントロールの子として設定することもできません。

これがあなたにとって何を意味するかというと、あなたの上司があなたに頼んだことはできないということです. バックグラウンドでできることは、アルゴリズムの計算だけです。せいぜい、 data をロードし、 dataを操作し、dataを解釈することができますが、そのデータを Windows コントロールに表示したり、Windows コントロールに変換したりしたい場合は、メイン スレッドでそれを行う必要があります。

唯一の解決策:

ただし、複数の UIThreads を持つことができます。つまり、複数Windowの を作成できます。そのため、タブのコンテンツごとに個別のスレッドでウィンドウを作成し、各タブでスレッド ウィンドウをホストする必要があります。

スレッドウィンドウ

ホスト プロセス ウィンドウ

クロススレッドホスティング

于 2012-07-24T21:21:00.233 に答える
-1

私は Xaade に同意しません。このコードだけを使用して必要なことを実行できると思います。

Dispatcher.BeginInvoke((Action)(() =>
{
        //  load the pages
}), DispatcherPriority.Background, null);

そのコードはバックグラウンドで実行されるため、必要なすべての webBrowser をロードできます。

DispatcherPriority を に指定するだけですBackground

于 2012-07-24T22:00:15.060 に答える