2011-10-04 6 views
3

ASP.NET 페이지에서 여러 HTTP 요청을 실행하려고합니다. 페이지 자체는 응답을 알 필요가 없으므로 처리를 계속해야하며 & 페이지를 제공하지 않아도됩니다.ASP.NET 비동기 작업

BackgroundWorker에 HTTP 코드를 넣고 비동기 적으로 실행하려고했지만 처음에는 다음과 같은 오류가 발생했습니다.

비동기 작업은이 컨텍스트에서 허용되지 않습니다. 페이지 시작 비동기 작업을 수행하려면 Async 특성을 true로 설정하고 및 비동기 작업은 PreRenderComplete 이벤트 이전의 페이지에서만 시작할 수 있습니다.

그래서 제가 말씀 드렸듯이 페이지에 비동기 속성을 부여했습니다. 그런 다음 몇 가지 조사를 수행하고 BackgroundWorker가 실제로 예상대로 비동기 작업을 수행하지 않는다는 것을 발견했습니다. 어떤 배경 독서 (http://www.pluralsight-training.net/community/blogs/mike/archive/2005/11/04/16213.aspx)는 저에게 그것을 알렸다;

사전 렌더링 및 PreRenderComplete 이벤트는 등록 된 비동기 모든 작업에 대한 시간 제한 이벤트 핸들러가 이 호출되고 반환 된 의 모든 때까지 재개하지 [마십시오].

어떻게하면 BackgroundWorker가 페이지 처리를 일시 중단하지 않도록 할 수 있습니까?

답변

2

또 다른 옵션은 ThreadPool.QueueUserWorkitem()입니다. 비동기 적으로 해제됩니다. 또한 asp.net 스레드 풀의 스레드를 사용합니다.

저는 일반적으로 gui/winforms의 서버 및 BackGroundWorker에서 threadPool을 사용했습니다. 그것은 할 수 없다는 말은 아닙니다. 다른 적어도 뭔가 당신이 BackgroundWorker에와 박히 경우 시도의

... 여기

는 몇 가지 다른 SO 게시물입니다 :

ThreadPool.QueueUserWorkItem uses ASP.Net

ThreadPool.QueueUserWorkItem with a lambda expression and anonymous method

ThreadPool.QueueUserWorkItem with function argument

+0

감사합니다. QueueUserWorkItem()이 내가 찾고있는 것입니다. 내가 한 스레딩은 GUI 작업이므로 BackgroundWorker를 사용하는 데 익숙했습니다. 나는 또한 모든 것을 깔끔하게 만들기에 좋은 작은 기사를 발견했다. (익명 유형 사용하기.) (http://thevalerios.net/matt/2008/05/use-threadpoolqueueuserworkitem-with-anonymous-types/) –

1

ASP.NET에서 진정한 비동기 작업을 수행하는 새로운 방법은 PageAsyncTask class. (MSDN 설명서에 몇 가지 샘플 코드가 있음)

또한 Thomas Maquardt의 read this post을 권장합니다. 가장 흥미로운 점은 다음과 같습니다.

좋아요, 그럼 비동기 적으로 작업을 수행할만한 이유가 있습니다. 어떻게해야합니까? 무엇보다도 먼저 요청 실행 중에 실행할 수있는 코드는 모두 이거나 모듈 내에서 실행되어야합니다 ( 핸들러). 다른 옵션은 없습니다. 을 비동기 적으로 비동기 적으로 수행하려면 현재 스레드에서 을 풀고 요청한 작업이 작업을 완료 한 경우에만 다시 시작해야하므로 비동기 모듈 또는 처리기 내에서 실행해야합니다.자신의 비동기식 모듈이나 처리기를 구현하고 싶지 않다면 ASP.NET 2.0은 비동기 페이지를 도입했기 때문에 운이 좋았습니다. IHttpAsyncHandler를 기반으로 빌드 된 기능으로 은 PageAsyncTasks라고하는 비동기 작업을 쉽게 실행할 수 있습니다. .

PageAsyncTask 클래스를 사용하지 않기로 선택하면 비동기 작업을 수행 할 코드 샘플도 제공됩니다.