长时间运行时 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 更新和提供消息的机会,以便用户至少知道正在发生的事情。
谢谢,
我创建了一个仅限 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 更新和提供消息的机会,以便用户至少知道正在发生的事情。
谢谢,