1

介绍:

我在 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 参数的重载,所以我确实有第二个示例的回调。但是,问题仍然存在于第三个示例中。

4

1 回答 1

0

我假设第三种情况是以某种方式更新化学对象?如果是这种情况,那么只需查看 RIA 服务的“命名更新”方法。希望这可以帮助

于 2011-12-21T16:29:04.817 回答