长时间运行时 Blazor Webassembly 客户端超时

Blazor Webassembly Clientside Timeout on long operation

我创建了一个仅限 Blazor Webassembly 客户端的应用程序。

有些功能需要一段时间才能完成 - 当它们出现时,会出现一个弹出窗口 window,说明页面没有响应。

我知道这个特定的功能需要很长时间才能完成,想知道是否有办法让这个特定的页面有更长的超时时间,这样用户就不必点击“等待”按钮出现在 Chrome?

某些代码隐藏在 css 或某个应用程序文件中?

或者有更好的方法来处理这个问题?

听起来整个操作 运行 在浏览器的应用程序线程上同步进行。

如果您的方法由于 I/O 操作(磁盘访问、数据库访问)而需要很长时间,然后利用底层提供程序和 'await' 提供的异步方法来释放浏览器的线程。

如果操作完全同步,则在新线程上触发该操作,使用:

await Task.Run(() => DoLongSyncOperation());

然后,更新 Blazor 中的 UI 组件以显示“正在加载”消息。

例如

@if (_theResult == null)
{
    <div>Loading ...</div>
}
else
{
    <div>@_theResult</div>
}

<button onclick=@RunJobAsync>Run Job</button>

@code {
    string? _theResult = null;

    async Task RunJobAsync()
    {
        _theResult = null;

        // Force UI Update to display "Loading ..."
        StateHasChanged();

        // If operation is truly sync:
        string result = await Task.Run(() => DoLongSyncOperation());
        // Or, If provider offers an async method:
        string result = await DoLongOperationAsync();

        _theResult = result;
    }
}

'await' 语句将允许将控制释放回 UI 并防止您收到错误消息,同时向用户显示结果或加载消息的指示。

注意:据我所知,Blazor WebAssembly 实际上在单个线程上运行,但使用调度技巧它可以将控制权释放回 UI 并在 UI 和 运行 任务,当该任务是 'awaited'.

Neil 提供了 backbone 并补充说,我在这个答案中获取了信息:

我将我的 LRQ 分成三个部分,然后按照建议创建一个方法“RunJobAsync”,然后在该函数中调用我添加的 LRQ 的每个部分:

StateHasChanged();    
await Task.Delay(1);

每次调用后,这里都会有一条消息传递给UI。

这似乎给了 UI 更新和提供消息的机会,以便用户至少知道正在发生的事情。

谢谢,