我知道这里有很多类型的问题。我想发布,以便我可以分享我的具体问题,因为我感到沮丧。调用线程无法访问此对象,因为不同的线程拥有它。如何编辑图像?
即时通讯运行一个线程,从数据库查询路径,并把它放在图像元素。问题是,我在xaml中创建图像,所以当我运行此线程时,它抛出无法访问此对象错误,它不能访问图像元件。
那么如何设置它,而不使用XAML?这里是我的代码片段:
public partial class Window1 : Window
{
Thread Frame1;
public Window1()
{
InitializeComponent();
intializeDb();
#region start frame 1 thread
Frame1 = new Thread(frame1);
Frame1.SetApartmentState(ApartmentState.STA);
Frame1.IsBackground = true;
Frame1.Start();
#endregion
}
public void frame1()
{
string k;
command.CommandText = "SELECT * FROM imageframe1";
sqlConn.Open();
Reader = command.ExecuteReader();
while (Reader.Read())
{
BitmapImage logo = new BitmapImage();
logo.BeginInit();
k = (string)(Reader.GetValue(1));
logo.UriSource = new Uri(k);
logo.EndInit();
image1.Source = logo; //THROWS THE ERROR HERE.IT CANT ACCESS image1
Thread.Sleep(1000);
}
sqlConn.Close();
Reader.Close();
}
我怎么会访问image1
呢?如果我在线程中创建一个新的,我将不得不作为一个面板的孩子,然后我会得到一个错误,它不能访问面板。
有什么办法解决这个问题吗?很高兴,如果有人可以根据我的代码片段写一个例子。
与仍然没有成功,并产生了同样的错误编辑:
public partial class Window1 : Window
{
public readonly SynchronizationContext mySynchronizationContext;
public Window1()
{
InitializeComponent();
mySynchronizationContext = SynchronizationContext.Current;
Frame1 = new Thread(frame1);
Frame1.SetApartmentState(ApartmentState.STA);
Frame1.IsBackground = true;
Frame1.Start();
}
public void frame1()
{
string k;
command.CommandText = "SELECT * FROM imageframe1";
sqlConn.Open();
Reader = command.ExecuteReader();
while (Reader.Read())
{
BitmapImage logo = new BitmapImage();
logo.BeginInit();
k = (string)(Reader.GetValue(1));
logo.UriSource = new Uri(k);
logo.EndInit();
SendOrPostCallback callback = _ =>
{
image1.Source = logo;
};
mySynchronizationContext.Send(callback, null);
//image1.Source = logo;
Thread.Sleep(1000);
}
sqlConn.Close();
Reader.Close();
}
}
冻结()IT +调用 – 2011-05-11 10:58:33