【问题标题】:How do I stop a Syncronous method racing ahead of an async Call如何在异步调用之前停止同步方法
【发布时间】:2019-06-01 22:08:31
【问题描述】:

我有一个类构造函数,格式为:

protected LoginFunctions(){…..}

在此函数中,我使用以下方法调用异步函数:

var tsk = Task.Run(async () => await PrePopulateLogin());

我的问题是当构造函数退出时 PrePopulateLogin 函数仍在运行。如何更改我的代码以使构造函数在 PrePopulateLogin 完成后才退出?

PrePopulateLogin 必须是异步的。

private async Task PrePopulateLogin()
    {
        var vector = await JSRuntime.Current.InvokeAsync<string>("blazorExtensions.ReadCookie", "vector");
        var secureNextLogon = await JSRuntime.Current.InvokeAsync<string>("blazorExtensions.ReadCookie", "SecureNextLogon");

        if (secureNextLogon != null)
        {
            var encryptor = new AesEncryptor(SecurityConstants.SecurityKey, Convert.FromBase64String(vector));
            var decryptedValue = encryptor.Decrypt(secureNextLogon);
            var email = decryptedValue.Split(' ')[0].Substring(6);
            var password = decryptedValue.Split(' ')[1].Substring(9);
            var rememberMe = decryptedValue.Split(' ')[2].Substring(11);
            if (rememberMe == "True")
            {

                UserModel.EmailAddress = email;
                UserModel.Password = password;
                UserModel.RememberUser = true;
            }
        }
    }

【问题讨论】:

  • 为什么不放一个.Wait()或类似tsk.result;的东西
  • 重新考虑创建您的构造函数,以便它使对象准备好工作,而不是实际执行该工作。将该逻辑移至另一个方法,并在构建对象后调用它 - 大概您调用它的代码是 async,您可以在其中正确地 await 它?
  • 是什么迫使PrePopulateLogin“必须是异步的”?因为使用Task.Run 似乎没有多大意义(“我有一些工作要做,但由于它正忙于做其他事情,所以无法在我的线程上完成它”)紧接着说“我在那边的Task完成运行之前,没有什么有用的事情可做”。
  • 不要在构造函数中调用任何方法。构造函数不应该做任何工作。

标签: c# blazor


【解决方案1】:

终于找到了使用 Blazor 的方法。

我需要从构造函数中删除调用,而是重写 BlazorComponents 初始化事件:

protected override async Task OnInitAsync()
{
    await PrePopulateLogin();
}

【讨论】:

  • 是的,每当您需要在构造函数中使用异步时,这意味着您需要找到不同的方式。对于像您在这里遇到的 Blazor 情况,这种方法是正确的。其他时候,可以选择创建静态异步工厂方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多