2014-06-05 5 views
1

나는 내 데이터베이스에 작은 룩업 테이블을 가지고있다. 큰 테이블을 처리하기 전에 로컬 테이블에로드하는 것이 효율적입니다. 중간 계층에서 서버 측의 복잡한 조인과 새로운 메타 데이터 유형 선언보다는이를 수행하는 것이 좋습니다.wcfria 동시성 클라이언트 측

protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     concurrencyFlags = 0; 
     context.Load<Priorite>(context.GetPrioritiesQuery(), LoadBehavior.RefreshCurrent, prioritiesHaveBeenLoaded, null); 
     context.Load<Projet>(context.GetProjectsQuery(), LoadBehavior.RefreshCurrent, projectsHaveBeenLoaded, null); 
     context.Load<TypeTicket>(context.GetTypeTicketsQuery(), LoadBehavior.RefreshCurrent, typeTicketsHaveBeenLoaded, null); 
     context.Load<Ticket>(context.GetOpenTicketsQuery(), LoadBehavior.RefreshCurrent, ticketsHaveBeenLoaded, null); 
     while (concurrencyFlags != everythingLoadedNow) System.Threading.Thread.Sleep(1000); 
     proceedSingleThreadedFromHere(); 
    } 

이 일을 적절한 방법은 무엇입니까 :

그래서 다음이 코드는 동시성이 작동하도록되어 방법의 이해의 나의 완전한 부족을 보여줍니다? 많은 감사,

답변

0

UI 스레드에서 차단하기 때문에로드가 수행되지 않을 수 있습니다. 또한 UI가 응답하지 않게됩니다. 대신로드가 완료 될 때 사용할 수있는 필드를 concurrencyFlags으로 만들어야합니다. 진행하기 전에 _concurrencyFlags의 값에 대한

private void prioritiesHaveBeenLoaded(...) 
{ 
    // Do work 

    _concurrencyFlags--; 
    proceedSingleThreadedFromHere(); 
} 

확인 :

각 방법에서
private int _concurrencyFlags; 

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    _concurrencyFlags++; 
    context.Load<Priorite>(context.GetPrioritiesQuery(), LoadBehavior.RefreshCurrent, prioritiesHaveBeenLoaded, null); 
    _concurrencyFlags++; 
    context.Load<Projet>(context.GetProjectsQuery(), LoadBehavior.RefreshCurrent, projectsHaveBeenLoaded, null); 
    _concurrencyFlags++; 
    context.Load<TypeTicket>(context.GetTypeTicketsQuery(), LoadBehavior.RefreshCurrent, typeTicketsHaveBeenLoaded, null); 
    _concurrencyFlags++; 
    context.Load<Ticket>(context.GetOpenTicketsQuery(), LoadBehavior.RefreshCurrent, ticketsHaveBeenLoaded, null); 
} 

, proceedSingleThreadedFromHere() 전화

private void proceedSingleThreadedFromHere() 
{ 
    if (_concurrencyFlags > 0) return; 

    // Do work 
} 

이 스레드로부터 안전하지 않습니다,하지만 WCF RIA 통화 기본적으로 UI 스레드로 돌아갑니다. 그래서 이론적으로는 프로토 타입에 충분할 것입니다.

+0

감사합니다. 에드, 맞습니다. 그냥 앉아서 신중하게 생각해야합니다. –