转换为此异步代码的Parallel / TPL

时间:2012-02-21 09:35:35

标签: wcf c#-4.0 task-parallel-library

我想知道如何将这种Begin-End-Async方法转换为更新的TPL语法:

    public override IAsyncResult BeginRegisterClaimant(ClaimantSex claimantSex, AgeGroup ageGroup, AsyncCallback callback, object state)
    {
        AsyncResult<string> asyncResult = new AsyncResult<string>(callback, state);
        InitManagementProxy();
        m_management.RegisterClaimantCompleted += RegisterClaimantCallbackInternal;
        m_management.RegisterClaimantAsync(m_configurationID, (PowWow.Service.ClaimantSex)claimantSex, (PowWow.Service.AgeGroup)ageGroup, new object[]
        { this, asyncResult
        });
        return asyncResult;
    }

    public override string EndRegisterClaimant(IAsyncResult asyncResult)
    {
        if (!(asyncResult is AsyncResult<string>))
        {
            throw new Exception("Invalid IAsyncResult object");
        }
        return ((AsyncResult<string>)asyncResult).Close();
    }

    private void InitManagementProxy()
    {
        WSHttpBinding binding;

        if (m_management != null)
        {
            return;
        }
        binding = new WSHttpBinding(SecurityMode.Transport);
        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
        m_management = new PowWow.Service.VerifierContractClient(binding, new EndpointAddress(m_managementUri));
        m_management.ClientCredentials.UserName.UserName = m_userName;
        m_management.ClientCredentials.UserName.Password = m_password;
    }

    private static void RegisterClaimantCallbackInternal(object senderObject, PowWow.Service.RegisterClaimantCompletedEventArgs eventArgs)
    {
        PowWowVerifier powWowVerifier = (PowWowVerifier)((Object[])eventArgs.UserState)[0];

        powWowVerifier.m_management.RegisterClaimantCompleted -= RegisterClaimantCallbackInternal;
        powWowVerifier.m_management.Close();
        powWowVerifier.m_management = null;

        if (eventArgs.Error != null)
        {
            ((AsyncResult<string>)((Object[])eventArgs.UserState)[1]).OnException(eventArgs.Error);
        }
        else
        {
            ((AsyncResult<string>)((Object[])eventArgs.UserState)[1]).OnExecuted(eventArgs.Result);
        }
    }

谢谢!

修改 ATM,不需要取消。可能需要进度报告,但不是优先事项。

1 个答案:

答案 0 :(得分:0)

最简单的方法是将现有代码包装在TaskCompletionSource中并返回它的Task - 这将适合C#5中新的async / await模型