2014-06-05 37 views
1

我在我的數據庫中有一堆小查找表。在處理大型表之前將它們加載到本地表中將會很有效。更喜歡這樣做,而不是服務器端的複雜連接,以及中間層的新元數據類型聲明。wcfria concurrency clientside

所以,那麼這段代碼演示了我完全缺乏的併發應該是怎樣工作的任何理解:

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線程上阻塞,加載可能不會發生。此外,您的用戶界面變得無法響應。相反,您應該使concurrencyFlags爲加載完成時可以使用的字段。

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 prioritiesHaveBeenLoaded(...) 
{ 
    // Do work 

    _concurrencyFlags--; 
    proceedSingleThreadedFromHere(); 
} 

檢查的_concurrencyFlags的值,然後再繼續:

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

    // Do work 
} 

這不是線程安全的,但WCF RIA電話回到UI線程默認情況下。所以從理論上講,它應該足夠用於原型。

+0

謝謝埃德,你是對的,我只是坐下來仔細想想一會兒,然後我明白了。 –