2012-03-26 2 views
1

우리는 WPF (UI) 응용 프로그램을위한 WCF RESTful 서비스를 만들었습니다. UI는 WCF 서비스에 요청을 보내고 BLL에서 적합한 메소드를 호출하고 DLL에서 메소드를 호출합니다. 이러한 모든 레이어는 IOC/DI를 사용하여 분리되었습니다.WCF RESTful 서비스의 Ansync 스레드

이제 새 기능에 대해 특정 유형의 새 개체가 데이터베이스에 추가 될 때 별도의 스레드에서 수행되는 3 단계를 거쳐야합니다.

즉, 서비스가 데이터베이스에 새 개체 OBJ를 추가하라는 요청을 BLL에 보내면 BLL은 개체를 DAL을 통해 데이터베이스에 저장 한 다음 새 스레드를 시작하여 개체없이 작업을 수행해야합니다. WCF 요청을 차단합니다.

하지만 BLL에서 새 스레드를 시작하여 시도 할 때마다 응용 프로그램이 충돌합니다. 데이터베이스 컨텍스트의 'InRequestScope'개체가 삭제되어 스레드가 데이터베이스를 업데이트 할 수 없기 때문에 그렇습니다. 또한 반환 값이 제공되고 BLL 메서드가 실행을 완료했지만 스레드가 완료 될 때까지 WCF 요청이 끝나지 않습니다.

어떤 도움이 많은 가치가있을 것입니다.

답변

1

이 문제에 대한 해결책과 설명을 알아 냈습니다. 오히려 어리석은 사람으로 밝혀졌습니다.

BLL (IsBackground = true; 포함)에서 스레드를 생성 했으므로 (서비스 요청에 의해 생성 된) 상위 스레드가이 스레드가 끝날 때까지 기다리고있었습니다. 두 스레드가 모두 종료되면 응답이 클라이언트로 다시 전송됩니다. 그리고 그 해결책은, 대신 로켓 과학이 아니라 그냥 BackgroundWorker를 사용하는 것입니다.

컨텍스트를 처리하기 위해 개체가 InRequestScope이고 요청이 종료 되었기 때문에. 그래서 저장소가 UnitOfWork (uow/context)를 필요로 할 때마다, 데이터베이스 요청이 완료 되 자마자 새로운 문맥을 생성하고 종료합니다. 그리고 해결책은, 인스턴스를 생성하고, 변수에 저장하고, 사용되어야하는 저장소로 전달하고, 모든 저장소가 새로운 저장소를 작성하는 것과 동일한 인스턴스를 사용하도록 강제하는 것입니다.

0

이것은 서비스 측면의 우려보다는 클라이언트 측의 문제로 보입니다. 클라이언트가 WCF 서비스에 비동기식 요청을하는 이유는 클라이언트에 자동으로 멀티 스레드 액세스를 제공하기 때문입니다.

내장 된 System.Net.WebClient (webHttpBinding 또는 WCF 웹 API 끝점에 액세스하고 있으므로)를 비동기 적으로 사용할 수 있습니다. 이 blog post은 완료 방법에 대한 간략한 개요를 제공합니다. 이 MSDN article이 I/O 파일 I/O에 적용되는 것으로 보이지만 약 3/4 아래에는 비동기 WebClient 사용 코딩에 대한 자세한 설명이 나와 있습니다.

+0

우리는 클라이언트가 응답을 기다리지 않도록 서버에서 프로세스를 실행하고 싶었습니다. 서버 측 프로세스 이상으로 클라이언트가 종료 되더라도 수행된다는 것을 의미합니다. 또한 서버의 트래픽을 줄입니다. –