wcf ria并发客户端

时间:2014-06-05 04:05:00

标签: concurrency client wcf-ria-services

我的数据库中有一堆小的查找表。在处理大型表之前将它们加载到本地表中会很有效。更喜欢这样做而不是服务器端的复杂连接和中间层的新元数据类型声明。

然后,这段代码表明我完全没有理解并发应该如何工作:

    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();
    }

这样做的正确方法是什么?非常感谢,

1 个答案:

答案 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线程。所以理论上它应该足够原型。