2014-06-05 39 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

谢谢埃德,你是对的,我只是坐下来仔细想想一会儿,然后我明白了。 –