질문 1번에 대한 문제점
DownloadFile 메서드에서 실제 http웹으로 파일을 다운로드 받는 로직 자체가
파일 사이즈를 계산해서 스트림을 이용해 파일을 쓰는 동기 방식으로 진행 되고 있습니다.
이는 while구문이 처리되는 동안은 메세지 펌핑이 안되기 때문에 렌더링 처리가 안되고 있는 것 입니다.
(뷰에서 IsAsync=True를 하셨는데 이는 실제 내부 동작이 비동기로 처리 되는 것은 아닙니다.)
그래서 모두 다운로드가 완료된 이후 진행율 표시가 되는 것 입니다.
해결방법은
다운로드 로직을 별도 스레드로 처리하여 비동기로 처리 하면 될 것 같습니다.
위 로직을 직접 System.Threading.Tasks로 처리 하시거나
특별히 문제가 되지 않는다면 System.Net.WebClient 클래스에서 제공되는 DownloadFileAsync 비동기 메서드를 사용해 보시면 될 것 같습니다.
Dispatcher 호출로 메세지 펌핑을 시켜줘도 될것 같지만 위 비동기 처리 방식이 더 좋을 것 같습니다.
질문 2번에 대한 개선 방향
현재 생각나는 방법으로는 두가지 방법으로 생각드는데
첫번째는
다운로드 로직을 별도의 서비스로 구현해서 뷰모델에 해당 서비스를 주입 시켜 주어서
실제 다운로드 처리는 서비스 내부에서 담당하고
뷰모델은 뷰에 관련된 부분만 바인딩으로 뷰에 통보 하는 방식 입니다.
이러한 처리를 '의존성 주입’이라 불리우는데 뷰모델을 IoC같은 구조로 관리를 해야 합니다.
의존성 주입(Dependency Injection)에 대해서 찾아보시면 될 것 같습니다.
두번째는
다운로드 처리를 비지니스 로직으로 판단해서 모델에 포함 시키는 것입니다.
즉 다운로드 로직과 진행율 정보가 되는 모델 하나를 만들어서
뷰에서는 모델의 데이터를 바인딩 처리하도록 합니다. 그럼 뷰모델에서는 모델을 이용해서 다운로드 처리 를 할 수 있습니다.