2010-06-08 3 views
0

나는이 시도 :asp.net mvc 2에서 비동기 코드를 어떻게 실행합니까?

BackgroundWorker bw = new BackgroundWorker(); 

    bw.DoWork += (o, e) => 
    { 
     SendConfEmail(); 
    }; 

    bw.RunWorkerAsync(); 

을했지만 작동하지 않았다. SendConfEmail을 실행하는 데 시간이 걸립니다. BackgroundWorker는 webform이 아닌 winforms를 위해 설계 되었기 때문에 그럴 것 같습니다.

어떤 아이디어로 문제를 해결할 수 있습니까?

답변

0

결국에는 AsyncCallback 개체를 사용하여 해결했습니다.

중앙 집중식 메일 서버 솔루션이 이상적이지만이 프로젝트는 불과 5 일 만에 완료되어야하는 개념의 시간 증명에 대한 증거였습니다.

1

백그라운드 스레드 대기가 요청 내에서 CPU에 대기하고 얻을 무의미한 가까이 될 것입니다. 아마도 모든 스레드의 전자 메일을 대기열에 넣고 별도의 프로세스 또는 global.asax 내에서 생성 된 전용 스레드에서 처리해야합니다.

+0

왜 무의미한가요? 전자 메일을 보내는 데 걸리는 5 초의 지연없이 확인 페이지를 사용자에게 표시하려고합니다. – NibblyPig

+0

@slc 무겁게 스레드 된 응용 프로그램에서 백그라운드 스레드를 생성하려고하기 때문에 무의미합니다. "배경"에 중점을 둡니다. 로드시 백그라운드 스레드가 많이 스케줄되지 않을 것입니다. 또한 이메일을 실제로 전송하는 데 소요되는 불확실한 시간을 추가하면 대기 시간이 1 초 미만으로 늘어날 가능성이 있습니다. 다른 디자인 가능성에 대해 생각하십시오. 대기열에 넣고 즉시 대기 페이지로 돌아가서 전자 메일이 전송 될 때까지 10 초마다 다시 게시합니다. 그것의 일반적인 패턴, 그리고 좋은 이유. – Will

+0

@slc 또한 "BackgroundWorker는 webform이 아닌 winforms를 위해 설계되었습니다." 좀 빠지는. BW는 백그라운드 스레드를 사용하므로 IIS의 스레드보다 CPU 시간이 훨씬 적습니다. 내 위의 진술. BTW, 확인 페이지를 표시 할 수 있도록 전자 메일이 전송 될 때까지 응답을 차단하려면 왜 백그라운드 스레드를 사용해야합니까? – Will

관련 문제