Введение:
У меня есть служба 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, поэтому у меня есть обратный вызов для второго примера.Однако остается вопрос для третьего примера.