Basic UIWPFフリーズUIを使用して複数のタブを同時にバックグラウンドで読み込む
私はUIを上の画像に示しています。
各タブには、データテーブルからデータを入力したグリッドのようなコントロールがあります。
私は何をしたいですか? 新しいタブを開くとウェブブラウザと同じように動作し、バックグラウンドで読み込まれます。 ブラウザ全体がフリーズしません。ツイッターが別のタブで読み込まれている場合、あなたはfacebookを見て、やりとりすることができます。
現在どのように動作していますか?
左側のツリービューのアイテムの1つをクリックすると、タブが開きますが、アプリケーションのUI全体がフリーズします。タブがグリッドにデータを完成するまで別のツリービューアイテムをクリックできません。ツリービューのクリックイベントに
現在の実装
、別のスレッドは、addTab() 関数を呼び出すことである作成されます。機能以下
treeviewlist_SelectedItemChanged()
{
Dim thread As New Thread(Sub() Me.AddTab(itemno))
thread.Start()
}
BackgroundWorkerのスレッドオブジェクトBW、 bg_doworkを(作成)のTabItemグリッドに結合するためにDBからデータテーブルを取得します。 bg_RunWorkerCompleted()は、そのdtをtabitemのグリッドにバインドします。
Addtab()
{
Thread.Sleep(TimeSpan.FromSeconds(2))
Dispatcher.BeginInvoke(New Action(Function()
Dim bg As New BackgroundWorker
AddHandler bg.DoWork, Sub(sender, e)
//get dt
End Sub
AddHandler bg.RunWorkerCompleted, Sub(sender, e)
// bind dt to grid
End Sub
Return 1
End Function), DispatcherPriority.Send)
}
私はWPFとvb.netに新しいですし、何とか私はどこかひどく台無しにしていると感じ正直に言うと。
スレッド内で唯一行ったことがメソッドを呼び出すときに、スレッドを作成するのはなぜですか? (そしてその方法で何らかの理由でマルチスレッドをやり直そうとしていますか?) 'Dispatcher(Begin)Invoke()'を呼び出すと、UIスレッドに実行が移ります。 - あなたが今やっていることはちょっと冗長です!新しいスレッドを作成して、マルチスレッドを再度実行するバックグラウンドワーカーを作成するUIスレッドでコードを実行するだけです。 BGWを始めることさえありません。スレッド内のすべてを実行し、UIにアクセスする必要があるときに呼び出すか、最初からBGWを使用するだけです。 –
_スレッド内のすべてを行い、UIにアクセスする必要があるときに呼び出す**タブ項目全体を動的に作成し、DBからデータテーブルを取得し、スレッドのグリッドにバインドし、作成されたタブコントロールにタブ項目を添付することは可能ですか? ** – ubergeek
はい、一度あなたがUIにアクセスした後であれば、ほとんど何でもできます。 –