2016-10-01 9 views
0

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に新しいですし、何とか私はどこかひどく台無しにしていると感じ正直に言うと。

+0

スレッド内で唯一行ったことがメソッドを呼び出すときに、スレッドを作成するのはなぜですか? (そしてその方法で何らかの理由でマルチスレッドをやり直そうとしていますか?) 'Dispatcher(Begin)Invoke()'を呼び出すと、UIスレッドに実行が移ります。 - あなたが今やっていることはちょっと冗長です!新しいスレッドを作成して、マルチスレッドを再度実行するバックグラウンドワーカーを作成するUIスレッドでコードを実行するだけです。 BGWを始めることさえありません。スレッド内のすべてを実行し、UIにアクセスする必要があるときに呼び出すか、最初からBGWを使用するだけです。 –

+0

_スレッド内のすべてを行い、UIにアクセスする必要があるときに呼び出す**タブ項目全体を動的に作成し、DBからデータテーブルを取得し、スレッドのグリッドにバインドし、作成されたタブコントロールにタブ項目を添付することは可能ですか? ** – ubergeek

+0

はい、一度あなたがUIにアクセスした後であれば、ほとんど何でもできます。 –

答えて

0

これはC#コードです。しかしそれは概念をうまく説明します。 async/awaitキーワードを使用します。以下のforループは、データアクセスコードで置き換えることができます。

ViewModel vm = new ViewModel(); 
...  
private async void Button_Click(object sender, RoutedEventArgs e) 
{ 
    await _loadEmployees(); 
} 

private Task _loadEmployees() 
{ 
    Task t = Task.Factory.StartNew(() => 
    { 
     var employees = new ObservableCollection<Employee>(); 

     for (long i = 0; i < 999999; ++i) 
      employees.Add(new Employee() { Name = "Name" + i, Address = DateTime.Now.ToString() }); 

     vm.Employees = employees; 
    }); 

    return t; 
} 

DataGridViewModelEmployeesプロパティにバインドされます。 DataGridUIVirtualizationを使用できるように

DataGridWidthHeightを設定します。

あなたはもっと疑問を尋ねることができます、私はここで更新します。

関連する問題