我想用来TaskCompletionSource
包装MyService
这是一个简单的服务:
public static Task<string> ProcessAsync(MyService service, int parameter)
{
var tcs = new TaskCompletionSource<string>();
//Every time ProccessAsync is called this assigns to Completed!
service.Completed += (sender, e)=>{ tcs.SetResult(e.Result); };
service.RunAsync(parameter);
return tcs.Task;
}
这段代码第一次运行良好。但是第二次我ProcessAsync
只调用 is 的事件处理程序(每次都使用Completed
相同的变量),因此它将执行两次!service
第二次抛出此异常:
已完成时尝试转换任务最终状态
我不确定,是否应该tcs
像这样声明为类级别变量:
TaskCompletionSource<string> tcs;
public static Task<string> ProccessAsync(MyService service, int parameter)
{
tcs = new TaskCompletionSource<string>();
service.Completed -= completedHandler;
service.Completed += completedHandler;
return tcs.Task;
}
private void completedHandler(object sender, CustomEventArg e)
{
tcs.SetResult(e.Result);
}
我必须用不同的返回类型包装许多方法,这样我必须编写丢失的代码、变量、事件处理程序,所以我不确定这是否是这种情况下的最佳实践。那么有没有更好的方法来完成这项工作?