Как использовать задачу <T>, вызывающую событие и ожидающую завершения события
У меня есть следующий сценарий:
Клиент, запрашивающий веб-сервис для запуска
public bool Start(MyProject project, string error)
Веб-сервис, который получает вызов от клиента в методе
public event EventHandler<StartEventArgs> startEvent;
public bool Start(MyProject project, string error)
{
Task<bool> result = StartAsync(project, error);
return result.Result;
}
protected virtual void OnStart(StartEventArgs e)
{
// thread safe trick, snapshot of event
var se = startEvent;
if (se != null)
{
startEvent(this, e);
}
}
private Task<bool> StartAsync(MyProject project, string error)
{
var taskCompletion = new TaskCompletionSource<bool>();
this.startEvent += (p, e) => taskCompletion.TrySetResult((e.Error == string.Empty) ? true : false);
this.OnStart(new StartEventArgs(project, error));
return taskCompletion.Task;
}
Приложение, которое подписывается на событие, которое находится в веб-службе:
app.Start += EventHandler(App_Start)
private bool App_Start()
{
// does something
returns true/false
}
Я хочу, чтобы веб-служба отключила событие в задаче, затем подождите, пока завершится функция в app.exe, а затем вернитесь сюда, чтобы уведомить пользователя об успешном завершении задачи.
Я не уверен, как это сделать, но в теории это будет выглядеть примерно так:
Task<bool> startTask = Task.Factory.StartNew(() => { OnStart() });
startTask.WaitAll(); // I think this is what I would need to for 4.0
return startTask.Result
Я надеюсь, что я достаточно нагляден, чтобы кто-то увидел, что я пытаюсь сделать. Я бы хотел, чтобы сервис не знал ничего о клиенте и просто запускал задачу, а когда событие завершилось, вернитесь к этой точке и верните клиенту логическое значение, представляющее успех / неудачу.
Возможно ли это, или я действительно ошибаюсь?
Обновить: Очевидно, OnStart не является событием, так как мне сделать то, что вы пытаетесь мне объяснить?