如何在多个InvokeAsync调用中保证CurrentUICulture一致性
如何保证多次InvokeAsync调用中的CultureInfo.CurrentUICulture一致
由于渲染器调度程序不是线程调度程序,多次InvokeAsync调用可能会使用不同的线程,有没有办法可以保证所有调用中的CultureInfo.CurrentUICulture完全一致?
我的应用区域设置是动态的(存储在会话中,不来自ASP.NET本地化中间件,可在SignalR circuit内动态修改,无需新建HTTP连接),当前区域设置存储在每个组件中,但来自不同circuit(可能携带不同区域设置)的事件可能需要修改其他用户渲染的组件实例内容。
我将组件的CultureInfo存储在组件内部,但我不想在模板中每次都编写ToString(Culture)或者@bind-X:culture="@Culture",这类写法既繁琐又容易遗漏出错,因此每当组件区域设置变更时,我会执行如下操作:
await InvokeAsync(() => CultureInfo.CurrentUICulture = newCulture);
这样操作是否足够保证该组件后续的其他InvokeAsync调用(以及渲染器调度程序)能正确获取到对应的线程区域设置?
目前看起来可以正常运行,但我没有在任何官方文档中找到相关保证(也没有文档说明InvokeAsync会在不同调用之间保留本地线程的值)
更新
我做了一个简单的测试页,实测CurrentCulture/CurrentUICulture完全不会:
- 在组件上下文中随异步调用流动
- 在
InvokeAsync()中修改后生效
因此目前没有可行解决方案,除非有人将该流动逻辑添加到renderer synchronization context的实现中。
我已经提交了对应的功能需求到.NET官方aspnetcore仓库的反馈队列中。
内容的提问来源于stack exchange,提问作者Jcl
相关产品推荐
相关产品推荐

