我有一个现有的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)主持一个完全独立的服务,我可以同步调用它?
答案 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
只要知道无论你使用哪种方法,该方法都必须像文档中所说的那样异步。它必须将控制权交还给呼叫者。