Асинхронный вызов в синхронном методе

Вот простой пример:

public event EventHandler CookinDone = delegate{};

public void CoockinRequest(){
    var indicator = new ActivityIndicator();
    ActivityIndicator.Show("Oooo coockin' something cool");

    var bw = new BackgroundWorker();    
    bw.DoWork += (sender, e) => CockinService.Cook();
    bw.RunWorkerCompleted += (sender, e) => {
       indicator.Hide();
       CookinDone.Invoke(this,null);
    };

    bw.RunWorkerAsync();
}

Теперь, каждый раз, когда я использую этот метод, я должен перехватывать событие CookinDone и двигаться дальше.

var cook = new Cook();
cook.CookinDone += (sender, e) => MessageBox.Show("Yay, smells good");
cook.CoockinRequest();

Но как я могу упростить это, сделать возвращаемый тип метода как Boolean и вернуть результат после завершения Cookin?

if (CoockinRequest()) MessageBox.Show('Yay, smells even better');

если я помещу туда что-то вроде while (bw.IsBusy) , он испортит мой ActivityIndicator, заморозит основной поток, и я чувствую это было бы ужасно. Есть еще кое-что Monitor.Wait и еще кое-что вроде TaskFactory , но все это кажется слишком сложным для использования в простых сценариях .

Это может также отличаться в разных средах, например, какой-то подход хорош для приложений WPF, кто-то для чего-то еще и еще много чего, но должен быть общий шаблон, не так ли?

Как вы это делаете? ребята?

6
задан iLemming 20 October 2011 в 21:20
поделиться