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() 함수를 사용하시는 방법이 있습니다.

void ResponseHandler(IAsyncResult result)
{
    //....... result에 대한 처리
    Dispatcher.BeginInvoke(delegate()
    {
        txtText.Text = "Test";
    });
}

참고로 추가로 변경된 사항을 말씀드리면,
WebClient 의 BassAddress URI가 로컬 경로도 사용할 수 있게끔 변경되었고,
WebClient에 UploadString 관련 함수가 추가되었습니다. 그래서 서버측으로 POST를 날리는 것도 쉬워지겠네요
chaoskcuf
프로그래밍/TIP& Study 2008/06/19 11:26

트랙백 주소 : http://chaoskcuf.com/trackback/147

댓글을 달아 주세요

Powerd by Textcube, designed by criuce
rss