2014-06-13 2 views
0

이 질문이 너무 광범위하지 않기를 바라지 만 Entity Framework를 사용할 때 디자인 문제가 발생했습니다.ASP.net에서 비동기 적으로 시드 메서드 호출 MVC

기본적으로 우리 회사는 응용 프로그램이 올바른 데이터베이스를 수동으로 업로드하고 그렇게하기 위해 업데이트 데이터베이스를 실행하지 않고 원하는대로 시드 할 수 있기를 원합니다. 단순히 구성 파일에서 시드 메서드를 이동하고 업로드 된 경로에서 데이터베이스를 수락하기 위해 생성자에 과부하를 걸기 만하면이 측면이 쉽게 작동합니다.

그러나 다음 질문을 받으면 설계 문제가 발생했습니다. 그들은 클라이언트 측에서 진행률 표시 줄/텍스트 출력을 통해이 시드가 발생했는지 그리고 얼마나 멀리 있는지를 나타내는 표시기를 제공하기를 원합니다. 시드 방법이 동 기적으로 실행되기 때문에 클라이언트 측이 실행되는 동안 잠기 게되므로 문제가되는 것으로 판명되었습니다.

시딩 방법은 완료하는 데 약 20 분이 걸리기 때문에 클라이언트가 뭔가를 다시하기 전에 기다려야하는 시간을 확실히 알지 못하기 때문에 이것은 이상적이지 않습니다. 비동기 컨트롤러를 사용하여 구현하려고 시도했지만 seeding 메서드가 void 유형이라고 불평했습니다. 파일 업로드에서 호출되고있는 actionresult은 다음과 같이 보이는

[HttpPost] 
    public ActionResult Index(HttpPostedFileBase file) 
    { 

     if (file.ContentLength > 0) 
     { 
      var fileName = Path.GetFileName(file.FileName); 
      string date = DateTime.Now.ToString("MM-dd-yyyy-HHmm-"); 
      fileName = date + fileName; 
      var path = Path.Combine(Server.MapPath("~/bin/SampleData"), fileName); 
      file.SaveAs(path); 
      //create config instance and seed path 
      Reseed reseed = new Reseed(fileName); 
      reseed.Seed(db); 
      GetTimeStamp(DateTime.Now); 
     } 

     return RedirectToAction("Index"); 
    } 
는 비동기 적으로 실행할 수있는 방법이 설계하는 좋은 방법이 될 경우

사람이 알고 있나요?

답변

0

서버에서 비동기 적으로 시드하는 것은 프로세스 기간 동안 스레드를 확보하는 역할을합니다 (IO 바인딩 인 경우). 반환하려면이 작업이 끝나기를 기다리는 것입니다. 컨트롤러를 비동기로 설정). 컴퓨팅 경계 연산이 아닌 병렬 처리를위한 좋은 후보는 아닙니다. 당신은 서버에서 클라이언트로의 연결을 가질 수있게된다 SignalR을 사용하여

웹 소켓 :

어느 쪽이든, 당신은 고려 가치가 몇 가지 접근 방법과 기술이 존재하므로 다시 클라이언트까지의 진행 상황을 얻으려면 클라이언트와의 연결에서 컨텐츠를 밀어 넣습니다. 이것은 소프트웨어가 지원하지 않는 긴 폴링으로 다운 그레이드됩니다. 그것의 양방향으로 조금 과장 될 수도 있습니다. 웹 소켓보다 적은 오버 헤드를 가지고 있으며, 서버에서 클라이언트로 반이중입니다

서버 전송 이벤트는, 그것은 또한

약간 다른 접근 방식이에서 리디렉션/반환 될 서버에서 클라이언트로 콘텐츠 밀어 수 있습니다 화면이 나타나고 프로세스가 완료되면 사용자에게 전자 메일을 보냅니다. 당신은 예정된 작업을 시작하거나, 일괄 처리를 시작하기 위해 처리되지 않은 것에 명령을 보낼 수 있습니다.

관련 문제