2014-02-19 2 views
2

에서 비동기 대의원 대 TPL 대 내가 생산에 잘 작동하는 응용 프로그램을 가지고,하지만 난 동시성 잘 구현 한 수 있는지 궁금해 C#스레드는 ASP.NET

기본적으로 n 개의 SQL 문을 즉시 생성 (약 50 개 생성) 한 다음 동시에 실행하고 .csv 파일에 데이터를 씁니다.

편집 : 먼저 페이지 요청을 반환 할 수 있도록 모든 작업을 수행 할 스레드를 만듭니다. 그 스레드에서 ...

각 SQL 문에 대해 TPL을 사용하여 새 작업을 만들고 datareader를 사용하여 실행하고 데이터를 디스크에 씁니다. 마지막 파일이 만들어지면 요약 파일에 요약 데이터를 작성하고 압축하여 사용자에게 제공합니다.

대신 스레드 또는 비동기 대리인을 사용해야합니까?

전반적인 접근법 (TPL)이이 상황에서 가장 좋은 방법인지 궁금한 점이있어서 코드를 게시하지 않았습니다.

제발 동적 인 SQL을 만드는 것에 대해 강의하지 마십시오. 데이터베이스에서 읽는 데이터베이스의 전문성과 질문과 관련이 없기 때문에 제게는 꼭 필요합니다. (독점 시스템의 백엔드로 7 천개 이상의 테이블이 있습니다.)

+0

코드에서 변경을 수행하기 전에 비동기식/멀티 스레딩/멀티 태스킹의 차이점을 확인하십시오. 그것들은 동일하지 않으므로 두 시나리오를 모두 시나리오에 결합해야합니다. – MarcinJuraszek

+0

ASP.NET에서'Task.Run' 또는'Task.Factory.StartNew'를하는 것은 정말 나쁜 생각입니다. HTTP 요청은 모든 작업이 완료 될 때까지 완료되지 않습니다. 이것으로 웹 애플리케이션의 확장 성을 정말로 상하게하는 것입니다. [async SqlDataReader API] 사용 (http://blogs.msdn.com/b/adonet/archive/2012/07/15/using-sqldatareader-s-new-async-methods-in-net-4-5-beta -part-2--examples.aspx)를 사용하십시오. – Noseratio

+0

@MarcinJuraszek 나는 두 개념의 차이점을 이해한다고 생각한다. :) 당신은 더 자세히 설명 할 수 있습니까? 은혜?어쩌면 datareader에 비동기 메소드를 호출 할 수도 있습니다. 비동기 대리인 언급했을 때 어쩌면 내가 비동기 콜백, 각 SQL 쿼리에 대한 하나의/쓰기와 그것을 완료했을 때 그것을 완료해야한다고 생각하고 있었고, 그것을 끝내면 지퍼 않습니다 .... – user2416689

답변

0

대신 스레드 또는 비동기 대리인을 사용해야합니까?

분명히 백그라운드 스레드 작업은 단일 HTTP 요청의 경계에 걸쳐 있습니다. 이 경우 해당 작업을 실행하는 데 사용하는 API (Task.Run, Delegate.BeginInvoke, ThreadPool.QueueUserWorkItem, new Thread 또는 그 밖의 것)이 중요하지 않습니다.

ASP.NET 주소 공간에서 여러 HTTP 요청에 걸쳐있는 긴 백그라운드 스레드 작업을 실행하면 안됩니다. 구현하기가 상대적으로 쉽지만 IIS 유지 관리, 확장 성 및 보안에 문제가있을 수 있습니다. WCF 서비스를 만들고 ASP.NET 페이지에서 호출하십시오.

How to: Host a WCF Service in a Managed Windows Service.

0

http 요청을 처리하는 스레드에서 ASP.Net의 새 스레드를 시작하고 새 스레드에 처리되지 않은 예외가있는 경우 작업자 프로세스가 즉시 중단됩니다. 우리가 WCF 서비스를 사용하고 ASP.Net에서 ASP.Net 스레드를 호출하더라도 결과를 기다릴 것입니다. 따라서 요청이 대기열에 있고 처리 대기열이 처리 용량에 따라 다른 시간에 처리 할 수 ​​있도록 대기열 처리 메커니즘을 사용하는 것이 좋습니다. 물론 우리가 대기열을 말할 때 우리는 대기열 실패, 대기열에 대해 생각할 필요가 있습니다 ... 그러나 그 응용 프로그램이 크고 확장 할 필요가 있다면 그 가치.