[WPF] Method not found on Dispatcher.Invoke()의 해결책
Method not found: 'System.Object System.Windows.Threading.Dispatcher.Invoke(System.Delegate, System.Object[])’
혹은 한국어 .NET Framework 버전일 경우
메소드를 찾지 못했습니다 : 'System.Object System.Windows.Threading.Dispatcher.Invoke(System.Delegate, System.Object[])
라는 Exception이 나타날 수도 있습니다.
상황은 이렇습니다.
WPF에서 WorkerThread가 어떠한 계산을 하고 그 결과를 UI에 반영하려고 합니다.
WorkerThread와 UI Thread는 각기 다른 Thread 개체이므로
WorkerThread에서 UI단의 쓰레드를 건들면 Deadlock의 위험의 있습니다.
Dispathcher.Invoke 함수와 delegate를 사용하여 그 결과를 UI에 반영합니다.
개발자의 작업 환경의 현재 상용 버전의 최신 버전인 Visual Studio 2008이고
Visual Studio 2008 Service Pack 1이 설치하였고,
그에 따라 .NET Framework 3.5 Service Pack 1까지 더불어 설치되었습니다.
그러나 배포를 원활하게 하기 위해
Linq 같은 기능을 배제하고, Target Framework를 3.0으로 세팅한 상태에서
작업을 하였습니다.
모든 작업이 끝났고 에러가 날만한 곳은 모두 try… catch 문으로 감싸 버렸습니다.
그리고 .NET Framework 3.0이 안 깔린 컴퓨터에
.NET Framework 3.0 redist를 설치하고
개발자가 작업한 결과물들 옮겨서 테스트 했습니다.
당연히 문제가 없습니다.
이제 최종 사용자에게 배포를 하였습니다.
참고로 .NET Framework를 한번도 깔지 않은 사용자입니다.
.NET Framework 3.0 redist 를 다운받을 수 있는 링크도 알려 주었습니다.
그러나 아쉽게도 IE가 문제를 일으켜 다운을 받을 수 없는 상황이었습니다.
그래서 개발자는 .NET Framework 3.5 redist 설치 파일을 다운받아 최종 사용자에게 전달하였습니다.
(혹시라도 Tarket platform이 .NET Framework 3.5 로 옮겨갈 때 또 다시 설치하는 귀찮음을 덜어주기 위해서였습니다)
상황은 어땠을까요?
제대로 실행되었으면 이 아티클을 쓰지 않았겠죠.
프로그램은 실행은 정상적으로 이루어졌습니다.
문제는 앞 전에 말한 Worker Thread가 결과를 반영하지를 못합니다.
그냥 마우스 클릭에 모두 반응하는데 결과는 나올 생각을 안 합니다.
Worker Thread 안에서
null 값 참조 등 모든 에러 날 상황에 대비하여 프로그램을 수정한 뒤
최종 사용자에게 다시 배포합니다.
더불어 회사에 다른 PC에서도 테스트를 해봅니다.
최종 사용자에게서 역시 안 된다는 피드백을 받았습니다.
이제 중요한 try…catch문에 Exception을 로그로 남기게 만들었습니다.
그리고 최종 사용자에게 다시 배포한 후 로그 파일을 전해 받았습니다.
그 로그 파일에는 이 글 제일 처음에 적어 놓았던 그 Exception이 발생되었다고 기록되었습니다.
Method not found: ‘System.Object System.Windows.Threading.Dispatcher.Invoke(System.Delegate, System.Object[])’
회사에 다른 PC에서도 정상적으로 돌아갔기에
Invoke 하던 도중 에러가 났을 거라고 가정하고, Invoke 되는 함수를 열심히 고치기 시작했습니다.
그러나 특별히 에러가 날 경우는 발견되지 않았습니다.
약속된 시간은 30분이 채 남지 않았습니다.
열심히 구글질 하기 시작했습니다.
이해할 수 없는 Exception인 경우 그 Exception 메세지를 그대로 검색해 보는 방법이 가장 효과적입니다.
물론 영문으로 써야겠죠. 그리고 검색엔진은 구글이겠죠.
http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/210f59f3-b4e1-4bae-93b9-dda3c5e32db9/
그리고 위의 아티클을 찾았습니다.
마지막 부분에 보면 rutt 라는 아이디를 쓰시는 분이 설명을 해놓았습니다.
Visual Studio 2008에서 .NET Framework 3.5 sp1 환경의 개발자에게는
Invoke Method는 아래와 같이 보입니다. (똑똑한 인텔리센스가 보여주죠)
Invoke(Delegate, array<Object>[]()[]) Invoke(Delegate, TimeSpan, array<Object>[]()[]) Invoke(Delegate, DispatcherPriority, array<Object>[]()[]) Invoke(Delegate, TimeSpan, DispatcherPriority, array<Object>[]()[])
그러나 서비스 팩을 깔지 않고 원래 .NET Framework 3.5 만 깔았을 경우
Invoke(DispatcherPriority, Delegate) Invoke(DispatcherPriority, Delegate, Object) Invoke(DispatcherPriority, TimeSpan, Delegate) Invoke(DispatcherPriority, Delegate, Object, array<Object>[]()[]) Invoke(DispatcherPriority, TimeSpan, Delegate, Object) Invoke(DispatcherPriority, TimeSpan, Delegate, Object, array<Object>[]()[])
위와 같이 DispatcherPriority를 파라미터로 명시적으로 넘겨주게 되어 있습니다.
개발자는 Invoke 함수를 아래와 같이 사용하였습니다.
this.Dispatcher.Invoke(new DelegateXXXX(DoSomething), new object[] { obj1 });
위에서 최종 사용자에게 .NET Framework 3.5 설치 파일을 전달했다고 했었죠?
여기서 문제가 생긴 것 이었습니다.
.NET Framework 3.5를 설치한 최종 사용자 환경에서는
DispatcherPriority를 명시적으로 넘겨주어야 하는 Invoke 함수만 있었던 겁니다.
물론 Target platform을 3.0을 설정해 놓고 컴파일 했었지요.
그래서 이상하게도 .NET Framework 3.0 을 설치한 환경에서는 정상적으로 실행됩니다.
이 일련의 문제는 .NET Framework 3.5 Service Pack 1을 최종 사용자에게 전달하면 해결되었습니다.
참 이해 안되는 부분이죠.
3.0에서는 되는데 3.5에서는 되질 않는다….
"프로그래밍 / TIP& Study" 분류의 다른 글
| [퀴즈] SQLite collate 문제 (0) | 2010/07/16 |
| [TIP] XP, Vista에서 CD/DVD롬이 보이지 않을 경우 (1) | 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 |

댓글을 달아 주세요
좋은글 감사합니다.
저도 이문제로 헤맸어요 -_-
글퍼갈께요^^
한국에도 각종 프레임워크 트러블슈팅이 많아졌으면 하는 바람에서 썼어요~
감사합니다