2011-01-13 3 views
7

클라이언트/서버 응용 프로그램에서 장기 실행 프로세스를 처리 할 수있는 방법을 설계하고 구현해야합니다. 일반적인 장기 실행 프로세스는 2-3 분이 소요될 수 있습니다. 그 동안 UI에 진행 상황을보고하고 UI를 계속 응답해야합니다. 서버 측 프로세스를 시작하고 할당 LRPID을 (긴 프로세스 ID를 실행) 다음 반환 프로세스를 시작장기 실행 프로세스에 대한 WCF의 진행 알림 - 어떻게?

  • 한 비동기 요청을 :

    나는 몇 가지 솔루션을하지만 내 마음에 이러한 데은 해당 LRPID를 사용하여 클라이언트에서 주기적으로 폴링합니다. (프로 : 간단한 배포, 방화벽이 장난하지 : Unelegant는, 자원 등 소모)

  • 를 사용하여 양면 인쇄 (예 : NetTcpBinding로) 바인딩 및 진전이 이루어지고로 (서버에서 콜백을 시작 프로 : 우아한, 효율적인, : 배포 악몽)

  • [귀하의 제안 ???]

당신이 이것을 어떻게 받아 들일 수 있습니까?

+0

작성된 클라이언트 측 응용 프로그램은 무엇입니까? –

+0

배포 악몽? 왜, IIS/WAS 때문에? 그런 다음 사용하지 마십시오. –

+0

@Daniel Auger : 클라이언트 응용 프로그램이 WPF로 작성되었습니다. –

답변

4

여기 Silverlight 응용 프로그램에 WCF 진행률 표시기를 만드는 방법에 대한 Dan Wahlin의 post입니다. 이것은 약간의 도움이되어야합니다.

+0

는 매우 멋지게 보입니다. 조금 더 살펴 봐야 할 것입니다.감사! –

+0

좋아, 이것은 최고의 중간 방법으로 판명되었습니다! 특히 네트워크 요청을 시작한 후 서버가 응답하기를 기다리면서 요청이 효과적으로 "대기 상태에 놓이기"때문에 (즉, 즉시 응답하지 않음) 서버는 연결을 유지하지만 활성 상태로 유지하지 않기 때문에 다시 보내야 할 때까지 (또는 90 초 후에 연결 시간이 초과 될 때까지 - 양면 클라이언트가 다시 연결되어 대기 할 때까지)이 방법을 사용하면 서버를 반복해서 치는 것을 피할 수 있습니다. 그러나 데이터가있을 때 여전히 즉각적인 응답을 얻습니다 보내십시오. " –

+0

또는 다른 말로하면, 진정한 양방향 버전을 시뮬레이트하는 이미 구현되고 경량이며 효과적인 폴링 시스템입니다. –

1

클라이언트의 방화벽 등에 대해 걱정하지 않으려면 ... 아마도 첫 번째 해결 방법을 사용하고 BackGroundWorker을 사용하여 UI 스레드 차단을 막으려 고합니다. 보고서를 생성하라는 요청이 대기열에 놓이고 일단 완료되면 검색되는 앱에 대해 최근에이 작업을 수행했습니다. 잘 작동하는 것 같습니다.

0

또 다른 방법은 (WCF 바인딩을 변경하지 않고) WPF 클라이언트에서 WebBrowser 컨트롤을 사용하고 서버에서 해당 컨트롤로 진행 메시지를 게시하는 것입니다.

WebBrowser 컨트롤에서 발생하는 javascript 오류 (기본적으로 jQuery.js와 호환되지 않는 Internet Explorer 버전 7이 사용 된 것 같습니다)를 피하려면 해당 웹 브라우저에 키를 추가해야합니다. 클라이언트 컴퓨터의 레지스트리를 사용하여 클라이언트 응용 프로그램의 기본값을 IE10 이상을 사용하도록 변경 - http://weblog.west-wind.com/posts/2011/May/21/Web-Browser-Control-Specifying-the-IE-Version 참조). 레지스트리 키를 추가하기 위해 64 비트 Windows 8.1 pc와 같이 관리자 권한이 필요할 것으로 보이기 때문에 배포가 불편할 수 있습니다. 또한, 여전히 실행중인 WCF 메서드를 별도의 스레드에서 호출해야합니다. 그렇지 않으면 WebBrowser 컨트롤이 수신중인 SignalR 메시지를 표시하기 위해 해당 디스플레이를 업데이트하지 않는 것처럼 보입니다. 그렇지 않으면 UI 스레드가 WCF 호출이 완료 될 때까지 대기해야하기 때문에 이것은 의미가 있습니다.

그러나 새로운 도구 (SignalR)를 사용하는 대안 방법으로 언급 :