Как заставить методы Entity в RIA DomainContext работать асинхронно

Введение:

У меня есть служба 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);
}

Третий пример:

If I do:

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? В первом примере я могу использовать метод обратного вызова при загрузке для ответа на завершение операции, но я понятия не имею, как сделать две другие функции асинхронными, и я не хочу, чтобы мой пользовательский интерфейс блокировался во время вызовов.

ИЗМЕНИТЬ:

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


person Kornelije Petak    schedule 01.06.2011    source источник
comment
Любая подсказка о том, как выполнить первый пример синхронно?   -  person Shimmy Weitzhandler    schedule 12.02.2012


Ответы (1)


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

person Paul Carter    schedule 21.12.2011