我的数据库中有一堆小的查找表。在处理大型表之前将它们加载到本地表中会很有效。更喜欢这样做而不是服务器端的复杂连接和中间层的新元数据类型声明。
然后,这段代码表明我完全没有理解并发应该如何工作:
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 :(得分:0)
因为您阻止了UI线程,所以可能不会加载。此外,您的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线程。所以理论上它应该足够原型。