Silverlight 2.0 beta2 에서 나타난 Invalid cross-thread access Exception
WebClient나 HttpWebRequest 함수가 silverlight 2.0 beta1에서 beta2 버전업 되면서 변경된 점이 있습니다.
.NET 에 http://chaoskcuf.com/87 와 비슷한 현상인데요.
Backgound Thread가 UI Thread를 건들면 SecurityException이 발생하는 내용입니다.
WebClient와 HttpWebRequest를 사용하여 비동기 통신을 할 경우
실버라이트 2.0 beta1까지는 Complete 관련 delegate에서
TextBox의 Text를 바꾸는 등의 UI thread에 접근하여도 아무런 제약이 없었습니다.
그러나 beta2 에서는 비동기 메서드에 new TextBox() 처럼 UI와 관련된 작업을 하면
SecurityException이 발생합니다
Exception 내용은 Invalid cross-thread access 입니다.
원인은 beta2 부터는 WebClient, HttpWebRequest delegate가 Background Thread로 반환이 되기 때문입니다.
어찌보면 비동기 콜백이 UI 단을 건드리면서 나타나는 deadlock 발생 가능성을 미연에 방지하기 위함입니다.
이 문제를 해결하기 위해서는 두가지 방법이 있습니다.
SynchronizationContext 라는 새로 추가된 클래스를 사용하시는 방법이 있고,
비동기 메서드 내에서 아래와 같이 Dispatcher.BeginInvoke() 함수를 사용하시는 방법이 있습니다.
참고로 추가로 변경된 사항을 말씀드리면,
WebClient 의 BassAddress URI가 로컬 경로도 사용할 수 있게끔 변경되었고,
WebClient에 UploadString 관련 함수가 추가되었습니다. 그래서 서버측으로 POST를 날리는 것도 쉬워지겠네요
.NET 에 http://chaoskcuf.com/87 와 비슷한 현상인데요.
Backgound Thread가 UI Thread를 건들면 SecurityException이 발생하는 내용입니다.
WebClient와 HttpWebRequest를 사용하여 비동기 통신을 할 경우
실버라이트 2.0 beta1까지는 Complete 관련 delegate에서
TextBox의 Text를 바꾸는 등의 UI thread에 접근하여도 아무런 제약이 없었습니다.
그러나 beta2 에서는 비동기 메서드에 new TextBox() 처럼 UI와 관련된 작업을 하면
SecurityException이 발생합니다
Exception 내용은 Invalid cross-thread access 입니다.
원인은 beta2 부터는 WebClient, HttpWebRequest delegate가 Background Thread로 반환이 되기 때문입니다.
어찌보면 비동기 콜백이 UI 단을 건드리면서 나타나는 deadlock 발생 가능성을 미연에 방지하기 위함입니다.
이 문제를 해결하기 위해서는 두가지 방법이 있습니다.
SynchronizationContext 라는 새로 추가된 클래스를 사용하시는 방법이 있고,
비동기 메서드 내에서 아래와 같이 Dispatcher.BeginInvoke() 함수를 사용하시는 방법이 있습니다.
void ResponseHandler(IAsyncResult result)
{
//....... result에 대한 처리
Dispatcher.BeginInvoke(delegate()
{
txtText.Text = "Test";
});
}
{
//....... result에 대한 처리
Dispatcher.BeginInvoke(delegate()
{
txtText.Text = "Test";
});
}
참고로 추가로 변경된 사항을 말씀드리면,
WebClient 의 BassAddress URI가 로컬 경로도 사용할 수 있게끔 변경되었고,
WebClient에 UploadString 관련 함수가 추가되었습니다. 그래서 서버측으로 POST를 날리는 것도 쉬워지겠네요
"프로그래밍 / TIP& Study" 분류의 다른 글
| [퀴즈] SQLite collate 문제 (0) | 2010/07/16 |
| [TIP] XP, Vista에서 CD/DVD롬이 보이지 않을 경우 (0) | 2009/08/05 |
| [C#] WinForm 에서 Docking 순서 변경하기 (0) | 2009/07/29 |
| [WPF] InkCanvas 사용하기 (0) | 2009/06/29 |
| [C#] Control Library 만들 때 TIP (0) | 2009/06/26 |
| [C#] 자연스럽게 Pen으로 그리기 (0) | 2009/06/23 |
| [WPF] Canvas의 Width, Height Binding (0) | 2009/06/23 |
| [C#] DateTime으로 7일 후는 어떻게? (0) | 2009/06/23 |
프로그래밍/TIP& Study
2008/06/19 11:26

댓글을 달아 주세요