介绍:
我在 Silverlight 应用程序上有一个 RIA 服务,它从 .Web 应用程序生成代码。在服务器端,我使用的是 EF4 和基于 EF4 模型的 DomainService。
第一个例子:
如果我用我自己的实现 IEnumerable 或 IQueryable 的方法扩展 DomainService,RIA 会在其 DomainContext 类上生成适当的方法。像这样的东西:
public partial class SymbolicDataService
{
public IQueryable<Chemical> GetWeightedChemicals(int min, int max)
{
// ... some EF query here
}
}
RIA 生成方法,所以我可以在 Silverlight 端做这样的事情:
private void btnLoad_Click(object sender, RoutedEventArgs e)
{
SymbolicDataContext db = new SymbolicDataContext();
var chemicals = db.Load(db.GetWeightedChemicalsQuery(10,24), onChemicalsLoaded, false);
}
然后我在onChemicalsLoaded回调函数中响应加载。
第二个例子:
如果我想要一个不返回 IEnumerable 或 IQueryable 的方法,但它是一个 void 方法,我将 DomainService 的方法标记为 [Invoke] 属性:
[Invoke]
public void FlushChemical(Chemical chemical)
{
// some code that does what it does (with EF)
}
现在我可以做类似的事情:
private void btnLoad_Click(object sender, RoutedEventArgs e)
{
SymbolicDataContext db = new SymbolicDataContext();
var chemical = db.GetWeightedChemicals(10,24).FirstOrDefault();
db.FlushChemical(chemical);
}
第三个例子:
如果我做:
public void ShakeChemical(Chemical chem, int timeShaking)
{
// Shake the chemical until it drops
}
RIA 将在客户端创建一个实体方法,使我能够做到这一点:
private void btnShake_Click(object sender, RoutedEventArgs e)
{
Chemical chem = (ListBox)sender.SelectedItem as Chemical;
chem.ShakeChemical(22);
db.SaveChanges();
}
问题:
我的问题是如何使最后两个示例像 LoadOperation 一样异步工作?在第一个示例中,我可以在 Load 方法上使用回调来响应操作完成,但我不知道如何使其他两个函数异步,并且我不希望我的 UI 在调用期间阻塞。
编辑:
我现在看到第二个示例的方法有一个带有 Action 参数的重载,所以我确实有第二个示例的回调。但是,问题仍然存在于第三个示例中。