2012-01-05 3 views
0

현재 두 개의 스레드가 실행 중이며 자주 Window.WindowStyle 속성을 설정해야하는 응용 프로그램을 만들고 있지만 시도 할 때 오류가 발생합니다. 그렇게하십시오 (내 호출이 스레드로부터 안전하지 않기 때문에). 이 문제를 해결하기 위해 InvokeRequired 메서드를 사용하는 방법을 이미 알고 있지만 this.WindowStyle.InvokeRequired를 입력하면 Viusal Studio에서 InvokeRequired가 유효한 속성이 아니라고 말합니다..NET Window.WindowStyle 속성에 대한 스레드로부터 안전한 호출

어떻게 해결할 수 있습니까?

내 응용 프로그램은 양식이 아닌 WPF 응용 프로그램입니다. 나는 VB.NET을 잘 모르기 때문에 C# 용어로 답을 선호한다.

도움 주셔서 감사합니다.

편집 : 좋아, 그래서 this.Dispatcher.CheckAccess()는 초기 문제를 해결 한 것 같지만 실제로 "if"문에서 실제로 호출하려고하면 같은 오류가 발생합니다. 어떤 제안?

+0

Window.InvokeRequired를 사용해야합니까? – malkia

+0

동일한 문제가 발생합니다. – danielmhanover

답변

1

을 확인해야합니다.

당신의 WPF 응용 프로그램 시작에

어딘가에, 당신은 이런 식으로 뭔가를 동기화 컨텍스트를 만들어야합니다

SynchronizationContext SyncContext = new DispatcherSynchronizationContext(); 

당신은 아마 동안이 부를 것이다, 그래서 현재 디스패처를 사용하여 동기화 컨텍스트를 생성합니다이 코드 디스패처가 시작된 후 기본 창의 초기화

다음 당신은 GUI 스레드에 코드를 마샬링하는 Send 또는 Post 방법을 사용하십시오

SyncContext.Send(delegate(object obj) { 
    // set main window style here, for example: 
    MainWindow.WindowStyle = WindowStyle.SingleBorderWindow; 
}, null); 

이 코드 프로젝트에서 동기화 컨텍스트에 대한 좋은 기사입니다 : http://www.codeproject.com/KB/threads/SynchronizationContext.aspx는하지만 윈도우 폼에 고유합니다.

+0

// ... 기본 윈도우 스타일 설정 영역에 무엇을 넣을까요? – danielmhanover

+0

위의 코드 예제를 수정하여 약간의 아이디어를 제공합니다. 기본적으로 GUI GUI 스레드에서 실행하려는 모든 것을 넣습니다. 귀하의 경우에는 기본 창에서 속성을 설정합니다. –

+0

나는 그것을 작동시켰다. 감사! – danielmhanover

0

당신은 당신이 이전 ISynchronizeInvoke 인터페이스 대신 여기 SynchronizationContext를 사용하는 경우 더 많은 성공을 생각 if (this.Dispatcher.CheckAccess())

+0

SetTextCallback 및 this.Invoke 대신 무엇을 사용합니까? – danielmhanover

+0

@ user788532 :'this.Dispatcher.BeginInvoke (새 작업 (...)) ' – SLaks

관련 문제