2009-05-21 6 views
3

WPF 응용 프로그램을 개발했습니다. 해당 응용 프로그램에서 200MB의 사진을 목록 상자에로드합니다. 그 후 캔버스에 이미지를 추가합니다. 언젠가 (예 : 10MB 이미지를 추가 한 후) 캔버스에 사진을 추가하는 동안 iam이 발생합니다. ----WPF 응용 프로그램의 성능을 향상시키는 방법

** *** CLR은 COM 컨텍스트 0x10b46f0에서 COM 컨텍스트 0x10b4860으로 60 초 동안 전환 할 수 없습니다. 대상 컨텍스트/아파트를 소유하는 스레드는 Windows 메시지를 펌핑하지 않고 비 펌핑 대기 또는 매우 오랫동안 실행중인 작업을 처리하는 중 가장 가능성이 큽니다. 이러한 상황은 일반적으로 성능에 부정적인 영향을 미치며 심지어 애플리케이션이 비 반응적이거나 시간이 지남에 따라 지속적으로 메모리 사용량이 누적 될 수도 있습니다. 이 문제를 방지하려면 모든 단일 스레드 아파트 (STA) 스레드는 CoWaitForMultipleHandles와 같은 펌핑 대기 기본 요소를 사용하고 장시간 실행하는 동안 일상적으로 메시지를 펌프해야합니다. *****

성능을 향상시킬 방법이 있습니까? 내 응용 프로그램. 이 문제에 대한 해결책이 필요합니다.

아무 제안 사항이 없습니다.

답변

5

UI 스레드에서 한꺼번에 200MB의 사진을 모두 목록 상자에로드하지 마십시오. 사용자가 한 번에 200MB를 모두 보게됩니까? 그것은 당신의 부분에 약간의 작업을 취할 것입니다,하지만 당신은 배경 스레드에서 이미지의 지연된 로딩을 할 필요가 있습니다.

+0

예, 사용자는 모든 이미지를 listbox에 표시합니다. 이미지를 목록 상자에로드하는 것은 문제가되지 않습니다. iam은 그 배경 스레드를 사용합니다. 하지만 문제는 캔버스에 사진을 추가하는 것입니다. 추가를 위해 나는 배경 작업자도 사용했다. –

3

article (.NET 응용 프로그램에서 교착 상태를 방지하고 감지하는 고급 기법)을 살펴보십시오.

0

이것은 두 가지 질문처럼 보입니다. 첫 번째는 백그라운드 스레드에서 이미지를로드하지만 올바르게 수행하지 않는 것입니다. 따라서 COM 오류입니다. STAThread 응용 프로그램이 있고 이미지로드 스레드가 WPF 디스패치 스레드와 잘못 상호 작용하고 있지 않은지 다시 확인하십시오. MTA와 STA는 discussion입니다. 그러나 WPF에는 STA가 필요하며이를 해결하기위한 전투는 느슨합니다.

두 번째 질문은 어떻게해야하는지입니다. 즉, 표시 할 이미지 모음을로드하는 것입니다. ListView의 게으른 데이터 바인딩을 살펴보고 내장 된 가상 화 발표자가 이미지의 로딩/표시를 관리하게 할 것입니다.

여기에 view-model을 사용하는 문서가 있습니다. 뷰 모델은 이미지로드를 조정하고 응용 프로그램을 자동으로 작동시키는 바인딩 소스를 ListView에 제공 할 수 있습니다.

더 간단한 대안은 배경 스레드를 시작하고 ObservableCollection <에 이미지를로드하는 것일 수 있습니다. ListView에 바인드하고 프레임 워크가 디스플레이를 처리하도록 할 수 있습니다.

Greg D가 말한 것에서 200mb 분량의 이미지를로드하는 것은 문제의 처방처럼 들립니다.

관련 문제