【问题标题】:Blazorserver timeoutBlazor 服务器超时
【发布时间】:2021-10-05 13:05:49
【问题描述】:
看看这个 blazor-server 代码:
@page "/test"
<button @onclick="@(() => on_btn_click())">Click me</button>
@code{
private async void on_btn_click()
{
for (int i=0;i<10000;i++) {
// insert/update/delete query
bdd.SaveChanges();
}
}
}
- blazor 服务器函数是否有最长执行时间(超时)?
我不是在谈论 sql-server 超时。我的查询并不慢,但我必须发送 10000 个查询。 (其实这不是真的,这是为了理解问题的一个例子)。我说的是 C# 代码执行超时。
非常感谢
【问题讨论】:
标签:
.net-core
blazor-server-side
asp.net-blazor
【解决方案1】:
问题的答案很大程度上取决于您的应用程序设计。
UI 应该只包含 UI 代码。数据代码应该在后端服务中。
如下代码不属于 UI - 没有关注点分离。
for (int i=0;i<10000;i++) {
// insert/update/delete query
bdd.SaveChanges();
}
如果将此代码移至范围服务并从 UI 调用它,则服务代码将独立于 UI 执行,并将在服务器端 Blazor Hub 会话被破坏之前完成。
作为单例服务,除非 Web 服务器服务被销毁,否则它将始终完成。
如果您想取消操作,您需要按照@Henk 的建议操作并使用取消标记。
这是一个简单的工作示例来演示服务原则:
慢服务
using System.Diagnostics;
using System.Threading.Tasks;
namespace StackOverflow.Answers.Data
{
public class SlowService
{
public async Task RunToCompletion()
{
for (var i = 0; i < 10; i++)
{
await Task.Delay(5000);
Debug.WriteLine($"Loop {i}");
}
}
}
}
作为范围服务添加到 StartUp
测试页
@page "/"
<div> <button class="btn btn-dark" @onclick="BtnClick">Start Slow</button></div>
@code {
[Inject] private StackOverflow.Answers.Data.SlowService slowService { get; set; }
private async Task BtnClick(MouseEventArgs e)
{
await slowService.RunToCompletion();
}
}
现在以调试模式启动,然后复制页面。单击重复页面中的按钮,然后关闭页面。观察调试器中的输出继续记录循环。