데이터베이스에 광범위한 데이터 삽입을 수행해야합니다. 동시 작업 수를 제한하는 스로틀 링 된 스케줄러로 코드를 멀티 스레드 방식으로 구현할 수 있습니다. 모든 M
행에 블록이 형성되어 원자 조작으로 데이터베이스에 삽입됩니다. 데이터베이스가 데이터 파일을 읽고 구문 분석하는 것보다 속도가 느리기 때문에 여러 동시 작업이 발생합니다. 필자는 종종 멀티 스레딩을 사용하여이 모델을 구현합니다. 동시 System.Threading.Tasks.Task의 수를 제한하십시오.
내가/await를 비동기 사용하여 내 코드를 구현하기로 대신하는 경우
I 동시에 이하 N 동시 작업가 (즉, 데이터베이스로 이동)을 실행하는지 확인하는 방법을 (엔티티 프레임 워크는 비동기 프로그래밍 지원)?필자의 초기 디자인에서는 원자 적으로 삽입 될 데이터 블록을 읽는 즉시 List<Task>
을 인스턴스화하고 새로운 작업을 추가 한 다음 await
모든 작업을 완료 한 후 내 메서드를 반환하도록했습니다. 디자인 타임 문제는 큰 데이터 파일에 대해 완료하는 것보다 빠르게 작업을 수행하기 때문에 동시에 발생하는 숫자가 Task
(및 메모리 풋 프린트)이 폭발한다는 것입니다.
SemaphoreSlim
을 사용하려고 생각했지만 비동기 프로그래밍 (멀티 스레드와 달리)에 대한 경험이 거의 없습니다. 그래서이 질문에 모범 사례에 대한 피드백을 얻으려고합니다.
내가 확실히는'SemaphoreSlim'이 경우에 갈 수있는 방법이라고 생각을 , 제한된 수의 다중 스레드를 실행하려는 경우. – Gertsen
작업이 IO 바인딩이므로 다중 스레드가 필요하지 않습니다. 추가 스레드없이 여러 개의 병렬 DB 쿼리를 실행할 수 있습니다. – Servy
[여기에는 제한된 동시성 작업 스케줄러가 있습니다.] (https://msdn.microsoft.com/en-us/library/system.threading.tasks.taskscheduler%28v=vs.110%29.aspx?f=255&MSPPError=- 2147217396) (구현을 위해 조금 아래로 스크롤하십시오). –