2012-06-26 116 views
2

它是为使用相同的负荷运行来加载多个实体可接受的实践,然后将其结合到异步地单个事件处理程序?我这样做是因为我使用了一个繁忙的指标,而且我们不知道哪个实体会更快地返回。的Silverlight 4个+ RIA服务加载

或者我应该将加载到多个负载操作/事件处理程序对分开?

LoadOperation GetResult; 

    private void LoadinDatagrid() 
    { 
     IsBusy = true; 
     GetResult = DomainContext.Current.Load(GetSomething1Query()); 
     GetResult = DomainContext.Current.Load(GetSomething2Query()); 
     GetResult = DomainContext.Current.Load(GetSomething3Query());   

     GetResult.Completed += new EventHandler(GetResult_Completed);      
    } 

    void GetResult_Completed(object sender, EventArgs e) 
    { 

     GetSomething1 = DomainContext.Current.Something1; 
     GetSomething2 = DomainContext.Current.Something2; 
     GetSomething3 = DomainContext.Current.Something3; 
     GetResult.Completed -= new EventHandler(GetResult_Completed); 
     IsBusy = false;  
    } 

回答

1

LoadOperation调用getResult;

private void LoadinDatagrid() 
{ 
    IsBusy = true; 

    GetResult.Completed += new EventHandler(GetResult_Completed);  
    GetResult = DomainContext.Current.Load(GetSomething1Query()); 
    GetResult = DomainContext.Current.Load(GetSomething2Query()); 
    GetResult = DomainContext.Current.Load(GetSomething3Query());   

} 

void GetResult_Completed(object sender, EventArgs e) 
{ 
    if(e.result!=null){ 
    if(e.result.x=="GetSomething1") 
    GetSomething1 = DomainContext.Current.Something1; 
    else if(e.result.x=="GetSomething2") 
    GetSomething2 = DomainContext.Current.Something2; 
    else if(e.result.x=="GetSomething3") 
    GetSomething3 = DomainContext.Current.Something3; 
    // 
    //Because when returned 1st data then stop eventhandler. 
    //GetResult.Completed -= new EventHandler(GetResult_Completed); 
    // 
    } 
    IsBusy = false;  
} 
0

尝试以下操作:

private int loadCounter; 

private void LoadinDatagrid() 
{ 
    loadCounter = 3; 
    IsBusy = true; 
    GetResult = DomainContext.Current.Load(GetSomething1Query(), LoadCompleted); 
    GetResult = DomainContext.Current.Load(GetSomething2Query(), LoadCompleted); 
    GetResult = DomainContext.Current.Load(GetSomething3Query(), LoadCompleted);   
} 

private void LoadCompleted(LoadOperation result) 
{ 
    Interlocked.Decrement(loadCounter); // Thread save decrementing 
    if(loadCounter == 0) // All queries have been loaded 
    { 
     IsBusy = false; 
    } 
}