首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wpf中的STA线程

wpf中的STA线程
EN

Stack Overflow用户
提问于 2012-09-16 18:22:28
回答 1查看 5.9K关注 0票数 0

我对ListViewItem.When有一个问题,我在一个线程中使用它,它显示一条消息:

“调用线程必须是STA,因为许多UI组件都需要这一点。”

然后我把它改为:

代码语言:javascript
复制
Mythread.SetApartmentState(ApartmentState.STA);

尽管当我使用它时,它再次显示一条消息:

“调用线程无法访问此对象,因为其他线程拥有该对象。”

我用调度员做的。它再次显示一条消息:

“调用线程无法访问此对象,因为其他线程拥有该对象。”

我在做什么来解决问题?

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-16 23:09:34

如果我正确理解,您希望启动一个工作线程来加载某种类型的实体,然后创建一个列表视图项来表示它。

我的猜测是,问题在于您正在线程中创建列表视图项,并试图使用Dispatcher将其附加到列表视图。相反,尝试如下:

代码语言:javascript
复制
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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12449461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档