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