2013-02-10 2 views
3

나는 mvc에서 비동기 작업을 시도한 적이 없기 때문에 어떤 방향으로 나아갈 지 모르겠습니다.mvc에서 작업을 시작하고 작업이 완료되면 알림을 받으려면 어떻게합니까?

나는 상당한 시간이 걸릴 수있는 많은 데이터로부터 Excel 파일을 생성하는 클래스가 있습니다. 사용자가 링크를 클릭하면 "완료되면 알림을 받겠습니다"라는 메시지가 표시되고 작업이 시작되면 웹 앱을 사용하여 계속 수행 할 수 있으며 화면에 알림이 표시되면 알림이 표시됩니다. 완료, 가급적이면 아약스 통해 동시에 실행되는 몇 가지 작업이있을 수 있습니다. 작업이 아직 실행 중인지 확인할 수 있다면 좋을 것입니다.

이러한 작업은

어떤 방법이 가장 적합하다 "요구에"항상 일정하지 않습니다? 나는 시스템이 있다는 것을 보았습니다. 스레딩, signalr, quartz.net 등이 있지만 과도한 공격 일 수 있습니다. AJAX 또는 SignalR :

덕분에,

+1

사용자는 작업을 시작한 페이지에서 다른 페이지로 이동하면서도 작업이 완료되면 다른 페이지에서 확인 메시지를받을 수 있습니까? 아니면 그들은 같은 페이지에 머무를 것인가? 첫 번째 구현은 상당히 어려울 수 있지만 AJAX 요청은 두 번째 작업을 수행하는 데 모두 필요할 수 있습니다. –

+0

다른 작업, C#에서 작업 완료 여부를 확인하는 방법이 있다면 ajax를 사용하여 타이머에 true 또는 false를 반환하는 webservice를 작성할 수 있습니다. –

+0

정기적 인 표준 AJAX 폴링과 SignalR의 두 가지 가능성을 생각해 볼 수 있습니다. –

답변

3

이 가능성이 떠오른다. 첫 번째는 순진한 접근 방식입니다. 작업을 시작한 다음 일정한 간격으로 AJAX 호출을 사용하여이 작업이 완료되었는지 확인합니다. 단점은 서버에 많은 요청을 보내는 것입니다.

두 번째 방법은 최신 브라우저에서 WebSockets 및 Push 알림을 클라이언트에 사용할 수있는 SignalR을 사용하는 것입니다. SignalR과 함께 AJAX 폴링 기술과는 달리 서버에 어떤 작업이 진행되거나 완료되었다는 것을 클라이언트에게 알릴 수있는 서버입니다. 이러한 종류의 시나리오에 훨씬 더 최적화되어 있습니다. 개인적으로 저는이 작업을 위해 SignalR을 사용하는 것이 좋습니다.

+0

고마워요.하지만 웹 어플리케이션의 다른 페이지를보고있는 동안 signalr이 백그라운드 작업을 시작할 수있는 방법을 보지 못했습니다. 페이지를 떠난 후에 작업을 실행하려면 어떻게해야합니까? –

+0

각 페이지마다 SignalR을 구독하는 스크립트가 있어야하며 작업이 완료되면 서버는 모든 구독 클라이언트에게 알림을 전송합니다. –

+0

우리는 특정 사용자에게만 통보합니까? –

4

클라이언트 쪽에서는 자바 스크립트 폴링 코드를 만들어야합니다. 이 같은
뭔가 : 또한

(function poll(){ 
    setTimeout(function(){ 
     $.ajax({ url: "server/checkStatus", success: function(data){ 
     // check notification data and react accordingly 
     }, dataType: "json"}); 
    }, 30000); 
})(); 

참조 :

:

서버 측에이 같은 객체의 예 (간체)를 생성

class MyTasks 
{ 
    Dictionary<int, Task> tasks; 

    public bool AllTasksDone {get;} 
    public bool GetNumberOfRunnigTasksForUser(int userId){} 

    public void AddTask(int userId, Task task){} 
} 

Application 또는 Session (사용자 세션 당 하나의 인스턴스)에 넣을 수 있습니다. 그리고 폴 요청에 응답하는 데 사용하십시오.

작업은 그냥 언급 쉽게

Task.StartNew(MethodName) 또는 Task.StartNew(()=>{your code})을 만들 수 있습니다 - WebSocket을 -이 일을하는 또 다른 방법이있다. 하지만 너무 무거운 무기입니다. 당신은 아마 그것을 원하지 않을 것입니다.

관련 문제