我正在从Windows Phone 7.1连接到SOAP服务。服务代理具有Get____Async
方法和Get_____Completed
个事件。
我正在我的客户端构建一个服务类,它包含对SOAP服务的调用。
我可以以某种方式将其包裹起来,使其界面变为:
public NNNNService
{
public async Task<List<NNNNNN>> GetNNNNN(A a, B b, C c)
{
// ?
}
}
答案 0 :(得分:3)
您可以使用以下模式将EAP包装到TAP中:
public static class NNNNServiceExtensions
{
public static Task<ReturnType> MethodNameTaskAsync(this NNNNService service, A a)
{
if (service == null)
throw new NullReferenceException();
var tcs = new TaskCompletionSource<ReturnType>();
EventHandlerType handler = null;
handler = (s, o) =>
{
service.MethodNameCompleted -= handler;
tcs.TrySetCompleted(o.Result);
};
service.MethodNameCompleted += handler;
try
{
service.MethodNameAsync();
}
catch
{
service.MethodNameCompleted -= handler;
throw;
}
return tcs.Task;
}
}
可选择支持取消,进度报告等。有时很难指定返回类型。如果您的Completed事件使用EventArgs,您可以通过以下方式调整代码:
public static Task MethodNameTaskAsync(this NNNNService service, A a)
{
var tcs = new TaskCompletionSource<bool>();
}