【发布时间】:2015-03-30 20:31:39
【问题描述】:
我有以下场景:
-
请求启动 web 服务的客户端
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; } -
订阅位于 Web 服务中的事件的应用程序:
app.Start += EventHandler(App_Start) private bool App_Start() { // does something returns true/false } 我希望 Web 服务在 Task 中触发事件,然后等待 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 不是一个事件,所以我该如何做你试图向我解释的事情?
【问题讨论】:
标签: c# multithreading asynchronous event-handling task-parallel-library