调用线程无法访问backgroundWorker中的object-RunWorkerCompleted事件c#

时间:2018-03-04 17:44:25

标签: c# wpf backgroundworker

  

调用线程无法访问此对象,因为另一个线程拥有它。

上面提到的异常消息通常发生在其他线程而不是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; } 事件访问它。)

那么,有人可以向我解释为什么会出现这个错误吗?

0 个答案:

没有答案