我正在从 Windows Phone 7.1 连接到 SOAP 服务。服务代理具有Get____Async
方法和Get_____Completed
事件。我正在我的客户端中构建一个服务类,用于包装对 SOAP 服务的调用。
我可以以某种方式包装它,使其界面变为:
public NNNNService
{
public async Task<List<NNNNNN>> GetNNNNN(A a, B b, C c)
{
// ?
}
}
我正在从 Windows Phone 7.1 连接到 SOAP 服务。服务代理具有Get____Async
方法和Get_____Completed
事件。我正在我的客户端中构建一个服务类,用于包装对 SOAP 服务的调用。
我可以以某种方式包装它,使其界面变为:
public NNNNService
{
public async Task<List<NNNNNN>> GetNNNNN(A a, B b, C c)
{
// ?
}
}
您可以使用以下模式将 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>();
}