此异步代码转换为并行/TPL

发布于 2025-01-07 09:35:32 字数 2314 浏览 4 评论 0原文

我想知道如何将这种 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,无需取消。可能需要进度报告,但不是优先事项。

I'm wondering as to how I'd go aroung converting this Begin-End-Async approach to the newer TPL syntax:

    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);
        }
    }

Thanks!

EDIT
ATM, cancellation is not required. Progress reporting maybe required but not a priority.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

烂人 2025-01-14 09:35:32

最简单的方法是将现有代码包装在 TaskCompletionSource 中并返回其任务 - 这将适合 C# 5 中的新异步/等待模型

The simplest way would be to wrap your existing code in a TaskCompletionSource and return it's Task - this will then fit in with the new async/await model coming in C# 5

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文