Как заставить методы Entity в RIA DomainContext работать асинхронно - PullRequest
1 голос
/ 01 июня 2011

Введение:

У меня есть служба RIA для приложения Silverlight, которая генерирует код из приложения .Web.На стороне сервера я использую EF4 и DomainService на основе модели EF4.

Первый пример:

Если я расширяю DomainService с помощью моих собственных методов, реализующих IEnumerableили IQueryable 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 создаст метод Entity на стороне клиента, который позволит мне сделать это:

private void btnShake_Click(object sender, RoutedEventArgs e)
{
    Chemical chem = (ListBox)sender.SelectedItem as Chemical;
    chem.ShakeChemical(22);
    db.SaveChanges();
}

Вопрос:

Мой вопрос здесь заключается в том, как заставить последние два примера работать асинхронно, как LoadOperation?В первом примере я могу использовать метод обратного вызова в методе Load для ответа на завершение операции, но я не знаю, как сделать две другие функции асинхронными, и я не хочу, чтобы мой пользовательский интерфейс блокировался во время вызовов.

EDIT:

Теперь я вижу, что метод второго примера перегружен аргументом Action, поэтому у меня есть обратный вызов для второго примера.Однако остается вопрос для третьего примера.

1 Ответ

0 голосов
/ 21 декабря 2011

Я предполагаю, что третий сценарий каким-то образом обновляет объект Chemical ?? Если это так, то просто посмотрите на методы «именованных обновлений» для RIA Services. Надеюсь, это поможет

...