从客户端公开WCF soap服务作为async Task <t>?</t>

时间:2013-02-18 09:42:28

标签: c# windows-phone-7 soap async-await

我正在从Windows Phone 7.1连接到SOAP服务。服务代理具有Get____Async方法和Get_____Completed个事件。 我正在我的客户端构建一个服务类,它包含对SOAP服务的调用。

我可以以某种方式将其包裹起来,使其界面变为:

public NNNNService
{
    public async Task<List<NNNNNN>> GetNNNNN(A a, B b, C c)
    {
        // ?
    }
}

1 个答案:

答案 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>();
}