我知道這裏有很多類型的問題。我想發佈,以便我可以分享我的具體問題,因爲我感到沮喪。調用線程無法訪問此對象,因爲不同的線程擁有它。如何編輯圖像?
即時通訊運行一個線程,從數據庫查詢路徑,並把它放在圖像元素。問題是,我在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