如何使RIA DomainContext中的实体方法异步工作

时间:2011-06-01 07:30:21

标签: silverlight entity-framework asynchronous ria domainservices

说明:

我在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方法的方法,我用[Invoke]属性标记DomainService的方法:

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

1 个答案:

答案 0 :(得分:0)

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