'silverligh'에 해당되는 글 1건

  1. 2008.10.23 Silverlight 2.0 beta2 에서 나타난 Invalid cross-thread access Exception
posted by 준치 2008. 10. 23. 17:48
구글 검색에서 찾은 중요한 정보
웹서비스 호출해서 값을 가져왔는지 텍스트 박스에 넣어 보려고 callback함수에 값을 넣는 순간
스레드 에러가 나서 찾아보니 이런게 있군여...밑에 비슷한 현상이나 뭐..읽어보면 도움이 됩니다.

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를 날리는 것도 쉬워지겠네요