У меня есть следующий сценарий:Как использовать Task <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 не является событием, так как мне делать то, что вы пытаетесь мне объяснить?
Является ли код выше на стороне App.exe для этого сценария? – ShaffDaddy
Nevermind, я просто понял (или так, я думаю, что сделал), где это должно быть :) – ShaffDaddy
Я собираюсь изменить свой код, чтобы вы могли видеть, что я пытаюсь сделать, я все еще немного смущен тем, как использовать TaskCompletionSource – ShaffDaddy