微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在C#中的同步方法和构造函数中等待

如何解决在C#中的同步方法和构造函数中等待

在我的应用程序中,有一个Asynch函数ProcessOffer(),我想在构造函数调用它,await ProcessOffer(),但我不能,因为构造函数是非异步的。

我的问题是如何在非异步功能/构造函数调用异步功能

注意::我已经尝试了这些Posts的答案,但它们没有帮助,没有解决方案。

public class Credentialviewmodel : ABaseviewmodel
    {
        private readonly CredentialRecord _credential;
        private readonly ICredentialService _credentialService;

        public Credentialviewmodel(
            ICredentialService credentialService,CredentialRecord credential
        ) : base(
            nameof(Credentialviewmodel)
        )
        {
            _credential = credential;
            _credentialService = credentialService;

            _credentialStatus = _credential.State.ToString();

            if (_credentialStatus == "Offered")
            {
                ProcessOffer();
            }
        }

        public async Task ProcessOffer()
        {
            // Code
        }
    }

更新

public class Credentialviewmodel : ABaseviewmodel
{

    [Obsolete]
    private Credentialviewmodel(
        IUserDialogs userDialogs,INavigationService navigationService,ICredentialService credentialService,IAgentProvider agentContextProvider,IConnectionService connectionService,IMessageService messageService,IPoolConfigurator poolConfigurator,CredentialRecord credential
    ) : base(
        nameof(Credentialviewmodel),userDialogs,navigationService
    )
    {
        // Code

        _credentialStatus = _credential.State.ToString();
    }

    [Obsolete]
    public static async Task<Credentialviewmodel> BuildCredentialviewmodel()
    {

        var obj = new Credentialviewmodel(default,default,default);

        if (obj._credentialStatus == "Offered")
        {
            await obj.ProcessOffer();
        }

        return obj;
    }

    [Obsolete]
    public async Task ProcessOffer()
    {
        // Code
    }
}

解决方法

您不能具有异步构造函数。

有一个简单的解决方法。将构造函数标记为私有,并向您的类添加静态异步方法,该方法将包装构造函数并在返回类之前执行异步工作。

    public class Class1
    {
        private Class1()
        {
        }

        public static async Task<Class1> BuildAsync()
        {
            var obj = new Class1();
            obj.MyData = await Task.FromResult("test");

            return obj;
        }

        public string MyData { get; set; }
    }

您将像这样初始化类:

var obj = await Class1.BuildAsync();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。