1

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

我可以以某种方式包装它,使其界面变为:

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

1 回答 1

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>();
}
于 2013-02-19T09:18:23.767 回答