调用线程无法访问此对象,因为另一个线程拥有它。
上面提到的异常消息通常发生在其他线程而不是UI线程本身访问UI控件时。我遇到了这个问题。就我的经验而言,我在尝试从{访问UI时遇到此错误{1}} BackGroundWorker
事件。当我意识到无法从不同的线程而不是UI线程访问UI这一事实时,我切换到其他方法来解决这种情况,通过做一些HEAVY在DoWork
事件中,非UI工作。今天,我想做一些不同的事情(可能与你之前没有任何不同,因为你之前可能已经这样做了。)我试图在DoWork
中做UI事情事件以一种非常不同的方式。
在我发布我的大量代码之前,请原谅我解释一下。
我的动机是从 WPF 中的数据库/数据表中加载一些DoWork
控件中的一些图像。这需要一些时间,因为数据库中不仅有一些图像/datatable.It会导致 UI-Freeze 。但是,如果我声明类级别Image
变量,请向其中添加图像,然后在{{1 }} event,我想做List(of BitmapImage)
循环并在RunWorkerCompleted
控件中加载图片。
在我测试之前,我尝试使用具有单个图像且仅有一个For Each
控件的数据库来实现此功能。
以下是我添加图片的方式:
Image
然后,在Image
中,我尝试加载该图片:
public class TestSub
{
BitmapImage CurrentUserPhoto = new BitmapImage;
private void LoadAccounts_DoWork(object sender, DoWorkEventArgs e)
{
con.Open();
OleDbCommand cmd2 = new OleDbCommand("Select * from userinfo where Email='" + currentemail + "'", con);
byte[] photo;
OleDbDataReader dr2 = cmd2.ExecuteReader;
while (dr2.Read)
{
try
{
photo = (byte[])dr2(11);
MemoryStream strm = new MemoryStream(photo);
BitmapImage bi = new BitmapImage;
bi.BeginInit();
bi.CacheOption = BitmapCacheOption.OnLoad;
bi.StreamSource = strm;
bi.EndInit();
CurrentUserPhoto = bi;
}
catch (Exception ex)
{
}
if (dr2(9).ToString == "")
{
}
else
{
CurrentUser = dr2(9);
}
}
con.Close();
}
}
BAMMM!发生错误!!在第一行RunWorkerCompleted
。我没有得到它,因为我(据我所知)不想从不同的线程访问UI(我的意思是,我没有从 private void LoadCurrentAccount_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
CurrentUserPhoto.BeginInit();
userpic.ImageSource = CurrentUserPhoto;
CurrentUserPhoto.EndInit();
CurrentUserName.Content = CurrentUser;
}
事件访问它。)
那么,有人可以向我解释为什么会出现这个错误吗?