1

我有一个现有的 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)在客户端代码中包含常量,并在/如果它发生变化时推出更新;或 2) 托管一个完全独立的服务,我可以以同步方式调用它?

4

2 回答 2

3

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

于 2012-06-24T13:23:00.190 回答
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

只要知道,无论您使用什么方法调用它,该方法都必须像文档中所说的那样是异步的。它必须将控制权交还给调用者。

于 2014-06-13T17:21:32.083 回答