【问题标题】:Set variable value in C# async method在 C# 异步方法中设置变量值
【发布时间】:2019-08-21 19:33:43
【问题描述】:

我有一个模型,我在async 方法中设置接收者,然后如果电子邮件是 X 类型,我需要从其他两个对象生成 URL。但是,model.Url 在分配接收者时不会被分配。我应该如何修复它以使其适用于两者?

private async Task GenerateUrl(Model model)
{
    var urlModel = GetUrlByOrganizationId(model.OrgId);
    var org = GetOrg(model.Id);
    model.Url = brand.Domain + org.Name;
    await Task.FromResult(model.Url);
}

private async Task<Email> GenerateEmail(User receiver, Guid brandId)
{
    var model = new Model()
    {
        title = "",
        Organization = organization,
        Url = string.Empty
    };

    try
    {
        await model.SetReceiverAsync(receiver, 0, model.Locale, model.Dialect);
        await this.GenerateUrl(model);
    }
    catch (Exception exc)
    {
        this.Log(LogLevels.Warning, exc.Message);
        return null;
    }


    // Send email
    var email = Sender.RenderModel(template, model);
    return email;
}

我想在var email = Sender.RenderModel(template, model); 行中使用model.Url

【问题讨论】:

  • 是否抛出异常?可能是 GetUrlByOrganizationId 或 GetOrg 失败。在 VS 中打开“异常设置”窗口,并为所有“CLR 异常”打开“抛出时中断”,以便在抛出任何托管异常(是否捕获)后立即在调试器中停止代码
  • 注意;你用var urlModel做什么?分配了一个值但从未使用过?您是否打算使用它但使用模型而不是导致 null ref 等?
  • 我看到您在这里错过了泛型类型 Task GenerateUrl(Model model) Task&lt;String&gt; GenerateUrl(Model model) 当您通过 Task.FromResult(mode.Url) 返回字符串时,这更有意义。
  • 所以在GenerateUrl(Model model) 中,我的模型似乎是null,即使我在调用方法之前为其设置了值

标签: c# asynchronous asp.net-core async-await


【解决方案1】:

不清楚为什么GenerateUrl 被定义为async 方法并返回Task。如果它只是设置模型的Url 属性,它应该是这样定义的:

private void GenerateUrl(Model model)
{
    var urlModel = GetUrlByOrganizationId(model.OrgId);
    var org = GetOrg(model.Id);
    model.Url = brand.Domain + org.Name;
}

并且在没有await的情况下调用:

this.GenerateUrl(model);

如果您打算从该方法返回 URL,则返回类型应为 stringTask&lt;string&gt;(但鉴于当前的实现,后者没有多大意义):

private async Task<string> GenerateUrl(Model model)
{
    var urlModel = GetUrlByOrganizationId(model.OrgId);
    var org = GetOrg(model.Id);
    model.Url = brand.Domain + org.Name;
    return Task.FromResult(model.Url);
}

private async string GenerateUrl(Model model)
{
    var urlModel = GetUrlByOrganizationId(model.OrgId);
    var org = GetOrg(model.Id);
    model.Url = brand.Domain + org.Name;
    return model.Url;
}

【讨论】:

  • 谢谢!我使用了第一部分,我重建了我的后端,一切都开始工作了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
相关资源
最近更新 更多