Преобразование в Parallel / TPL для этого асинхронного кода - PullRequest
0 голосов
/ 21 февраля 2012

Мне интересно, как бы я смог преобразовать этот подход 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);
        }
    }

Спасибо!

РЕДАКТИРОВАТЬ Банкомат, отмена не требуется.Отчет о прогрессе может быть необходим, но не является приоритетом.

1 Ответ

0 голосов
/ 21 февраля 2012

Простейшим способом было бы обернуть существующий код в TaskCompletionSource и вернуть его Task - это будет соответствовать новой модели async / await, появившейся в C # 5

...