0

ListViewItemに問題があります。スレッドで使用すると、次のメッセージが表示されます。

「多くのUIコンポーネントがこれを必要とするため、呼び出しスレッドはSTAである必要があります。」

それから私はそれをに変更します:

Mythread.SetApartmentState(ApartmentState.STA);

私がそれを使うとき、それは再びメッセージを表示しますが:

「別のスレッドがオブジェクトを所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません。」

ディスパッチャーを使用しています。再びメッセージが表示されます。

「別のスレッドがオブジェクトを所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません。」

問題を解決するために私は何をしていますか?

Thread th = new Thread(() =>
    {                                          
        search.SearchContentGroup3(t, addressSearch.CurrentGroup.idGroup);
    });
th.SetApartmentState(ApartmentState.STA);
th.Start();


public void SearchContentGroup3(int id)
{
    ListViewItem lst = new ListViewItem();
    lst.DataContext = p;        
    Application.Current.Dispatcher.BeginInvoke(
        new Action(() => currentListView.Items.Add(lst)),
        DispatcherPriority.Background);
}
4

1 に答える 1

1

私の理解が正しければ、ワーカー スレッドを開始してある種のエンティティをロードし、それを表すリスト ビュー アイテムを作成する必要があります。

私の推測では、スレッドでリスト ビュー アイテムを作成し、Dispatcher を使用してそれをリスト ビューにアタッチしようとしていることが問題であると思われます。代わりに、これを試してください:

public void SearchContentGroup3(int id)
{
// Do stuff to load item (p?) 
// ...

// Signal the UI thread to create and attach the ListViewItem. (UI element)
Application.Current.Dispatcher.BeginInvoke(
    new Action(() => 
    {
       var listItem = new ListViewItem() {DataContext = p};
       currentListView.Items.Add(lst); 
    }),
    DispatcherPriority.Background);
}
于 2012-09-16T23:09:34.440 に答える