【问题标题】:Asynchronous localization with custom resource storage in asp.net core在 asp.net 核心中使用自定义资源存储进行异步本地化
【发布时间】:2020-02-25 09:03:25
【问题描述】:

我在 .net 核心中为 IStringLocalizer 使用自定义存储,它具有异步方法来获取资源。 我想让它一直异步。 这是sn-p:

public class CustomStringLocalizer : IStringLocalizer
    {
        public LocalizedString this [string name]
        {
            get
            {
                var culture = CultureInfo.CurrentUICulture;

                Task<string> translation = _customStorage.GetResource(culture, key, name).Result; //can't make it 'await'

                return new LocalizedString (name, translation, translation != null);
            }
        }
    }

如何使属性异步,以便可以将 await 用于此方法? 从任务中获取结果也会出现错误:发生了一个或多个错误。 (类型'Task`1'必须是可序列化的)

【问题讨论】:

  • Task&lt;string&gt; translation = _customStorage.GetResource(culture, key, name).Result; 看起来这个方法的返回类型是Task&lt;Task&lt;string&gt;&gt; 这对我来说似乎是一个错误。
  • 目前,它不起作用,所以问题是如何摆脱从任务中获取“结果”
  • "如何摆脱从任务中获取"结果""我不太明白这个问题。我也不知道_customStorage的接口或实现。
  • 它返回 Task... 摆脱意味着我不想调用任务的结果,因为它消除了整个异步想法。
  • 如果不使用 .Result 或 .GetAwaiter().GetResult() (这些或多或少相等),您将无法在非异步上下文中使用异步调用。简直没有办法。您要么使 .GetResource(...) 同步,要么使用 .Result。也许您可以在启动时预加载这些值,这样您就不必每次都调用 .GetResource(...) 了?

标签: asp.net-core asynchronous async-await localization asp.net-core-localization


【解决方案1】:

您不能使属性异步。请改用异步方法。

【讨论】:

  • 这个属性来自于必须实现的默认本地化界面
  • 那么这种情况下调用.GetResource的时候恐怕得用.Result了。
猜你喜欢
  • 2019-01-13
  • 2020-11-03
  • 2020-06-11
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 2017-03-26
相关资源
最近更新 更多