WPF UI Thread 질문 입니다.
private delegate void UpdataScreenDelegate(Image imgs, BitmapImage bimg);
///////
private void Button_Click(object sender, RoutedEventArgs e)
{
if (server.DefultStarting())
{
text.Text = "서버 가동";
text.Text = text.Text + "\n접속대기";
}
else
{
text.Text = "서버 가동 실패";
return;
}
end = true;
server_Thread = new Thread(new ParameterizedThreadStart(Server_Run));
server_Thread.IsBackground = true;
server_Thread.Start(img);
}
///////
private void Server_Run(object t)
{
Image te = (Image)t;
if (server.Accept())
{
//MessageBox.Show("클라이언트 접속");
}
else
{
//MessageBox.Show("클라이언트 접속 끊김");
return;
}
data d = new data();
while (end)
{
d = (data)server.DataReceive(d);
BitmapImage bi = (BitmapImage)d.Screen;
te.Dispatcher.BeginInvoke(new UpdataScreenDelegate(UpdataScreen), te, bi);
d.Event = "이벤트전송";
d.Screen = null;
server.DataSend(d);
}
server.Close();
}
///////
private void UpdataScreen(Image imgs, BitmapImage bimg)
{
imgs.Source = bimg;
}
WPF에서 스레드에서 UI쪽을 변경하기 위해선 Delegate와 BeginInvoke를 쓰는 것으로 알고 있습니다. TextBlock으로 했을 땐이상없이 잘 되던 것이
Image로 변경해서 하니 다음과 같은 오류가 발생합니다.
------------------------------------------------------------------------------------------------------------------------
System.InvalidOperationException에서 'WindowsBase.dll' 형식의 예외가 발생했지만 사용자 코드에서 처리되지 않았습니다.
추가 정보: 다른 스레드가 이 개체를 소유하고 있어 호출한 스레드가 해당 개체에 액세스할 수 없습니다.
------------------------------------------------------------------------------------------------------------------------
이것 저것 찾아보다가 이해가 가질 않아서 질문 드립니다.
감사합니다.
자답입니다.
private void UpdataScreen(Image imgs, BitmapImage bimg)
{
imgs.Source = bimg;
}
에서
imgs는 걸리지 않는데
bimg가 걸리더군요. 그래서 UpdataScreen함수에 Bitmap으로 전송한뒤 BitmapImage 로 변환하여 해결 하였습니다.
댓글 달기