我使用后台工作程序来调用方法,但作为回报,给我一个例外,这里是代码
private void Button_Click(object sender, RoutedEventArgs e)
{
BGW.RunWorkerAsync();
}
void BGW_DoWork(object sender, DoWorkEventArgs e)
{
e.Result = new Drug_Class().Search(Filter);
}
class Drug_Class
{
public List<WorkSpaceVariable.Drug_List> Search(Expression<Func<db.Drug_Catalog, bool>> Filter)
{
using (db.PVDBDataContext PVDB=new PVDBDataContext ())
{
try
{
var DQuary = from D in PVDB.Drug_Catalogs.Where(Filter)
select new WorkSpaceVariable.Drug_List
{
Drugs_ID = D.Drugs_ID
}
return DQuary.ToList() ;//Exception The calling thread cannot access this object because a different thread owns it.
}
catch (Exception E)
{
return null;
}
}
}
我不明白为什么我得到这个例外可能有人告诉我我的代码有什么问题吗?
答案 0 :(得分:2)
你得到的Exception
真正解释了你的问题......你所要做的就是阅读它:
调用线程无法访问此对象,因为另一个线程拥有它。
您应该知道BackgroundWorker
在后台线程上工作,所以您应该能够确定所提到的两个线程是后台线程和主UI线程。
这意味着您无法操纵在任何其他线程上的主UI线程上声明(因此拥有)的UI对象。
解决方案是不在后台线程中的UI线程中操作UI对象。相反,只需操作后台线程中的数据,并在BackgroundWorker
完成时,然后通过更新数据绑定集合来更新UI元素。