【问题标题】: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# 代码执行超时。

  • 如果用户关闭浏览器并且 on_btn_click 没有完成会发生什么?此功能是否在后台任务中继续?还是被杀了?

  • 如果用户在我的 blazorserver 应用程序中更改页面并且 on_btn_click 尚未完成,会发生什么情况?

非常感谢

【问题讨论】:

    标签: .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();
        }
    }
    

    现在以调试模式启动,然后复制页面。单击重复页面中的按钮,然后关闭页面。观察调试器中的输出继续记录循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      • 2020-12-02
      • 2021-02-24
      • 2020-05-15
      • 1970-01-01
      • 2021-12-27
      • 2019-01-20
      相关资源
      最近更新 更多