如何进行同步RIA请求

时间:2012-06-21 19:02:30

标签: .net asynchronous wcf-ria-services ria

我有一个现有的RIA服务,我想在其中包含一个非常简单的调用,以查找某个自定义对象允许的最大字段数。如果有的话,该值很少会发生变化,我想在需要时只调用一次,然后将其保存在客户端上。但是,当我需要知道该值时,我需要以同步的方式知道它,因为我将立即使用它。

我已尝试过以下操作,但.Value始终为0,因为在运行此代码块时,服务实际上并未发出请求,而是稍后的某个时间。

private static readonly Lazy<int> _fieldCount =
    new Lazy<int>(() =>
        {
            const int TotalWaitMilliseconds = 2000;
            const int PollIntervalMilliseconds = 500;

            // Create the  context for the RIA service and get the field count from the server.
            var svc = new TemplateContext();
            var qry = svc.GetFieldCount();

            // Wait for the query to complete. Note: With RIA, it won't.
            int fieldCount = qry.Value;
            if (!qry.IsComplete)
            {
                for (int i = 0; i < TotalWaitMilliseconds / PollIntervalMilliseconds; i++)
                {
                    System.Threading.Thread.Sleep(PollIntervalMilliseconds);
                    if (qry.IsComplete) break;
                }
            }

            // Unfortunately this assignment is absolutely worthless as there is no way I've discovered to really invoke the RIA service within this method.
            // It will only send the service request after the value has been returned, and thus *after* we actually need it.
            fieldCount = qry.Value;

            return fieldCount;
        });

是否有任何方式使用RIA服务进行同步,按需加载服务调用?或者我是否必须:1)在客户端代码中包含常量,并在/ if-ever更改时推送更新;或者2)主持一个完全独立的服务,我可以同步调用它?

2 个答案:

答案 0 :(得分:3)

不幸的是,您不能同步使WCF RIA工作。您可以做的是将值放在承载Silverlight的HTML中的InitParams标记的<object>中。阅读更多:http://msdn.microsoft.com/en-us/library/cc189004(v=vs.100).aspx

答案 1 :(得分:1)

我意识到此前的答案可能在几年前就已经存在,但现在并不像我刚刚发现的那样完全正确。查看await运算符http://msdn.microsoft.com/en-us/library/hh156528.aspx

我认为这正是你要找的。您可以在异步方法中调用它(必须在方法的开头使用async修饰符,如:private async void dostuff())。虽然父方法仍然是异步的,但它将等待对任务的调用。

假设您是从域数据服务中执行此操作。这是一个例子: 注意:您的DDS必须返回一种IEnumerable。在从DDS调用数据之前,请定义一个私有任务方法,该方法检索有问题的数据,如下所示:

private Task<IEnumerable<fieldCounts>> GetCountssAsync()
    {
        fieldCountsEnumerable_DS _context = new fieldCountsEnumerable_DS ();
        return _context.LoadAsync(_context.GetCountsQuery());
    }

然后,您可以在现有的异步ria服务方法或任何真正使用await的客户端方法中调用该任务:

IEnumerable<fieldCounts> fieldcnts = await GetCountssAsync();
enter code here

只要知道无论你使用哪种方法,该方法都必须像文档中所说的那样异步。它必须将控制权交还给呼叫者。