Вот простой пример:
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, кто-то для чего-то еще и еще много чего, но должен быть общий шаблон, не так ли?
Как вы это делаете? ребята?