Blazor 组件中的后台线程和事件处理程序 运行
Background thread and event handler running in Blazor Component
我在使用简单的 Blazor 组件时遇到问题。当按下表单中的按钮时,组件应启动一个后台线程,将新元素添加到列表中(使用 SSE HTTP 调用)。在下面的代码中,问题是事件处理程序从未被调用,新消息也没有被渲染。我认为问题是由于 StartAsync() 调用阻塞引起的,但我似乎无法在新线程上得到它 运行。
namespace BlazorTest
{
public class DeepViewerComponent : ComponentBase
{
internal string SecretKey;
internal string PublishableKey;
private void OnNewMessage(string message)
{
this.Messages.Add(message);
this.StateHasChanged();
}
private async Task ComponentMessageReceived()
{
this.Messages.Add("Component message from SSE");
await this.InvokeAsync(StateHasChanged);
}
internal async Task Subscribe()
{
for (int i = 0; i < 3; i++)
{
await Task.Delay(500);
this.OnNewMessage($"message {i}");
}
this.sandBoxClient = new IEXCloudClient(publishableToken: "a", secretToken: "b", signRequest: false, useSandBox: true);
this.sseClient = sandBoxClient.SSE.SubscribeCryptoQuoteSSE(new List<string>() { "btcusdt" });
sseClient.MessageReceived += async (s) => await ComponentMessageReceived();
this.OnNewMessage("Starting");
await sseClient.StartAsync();
this.OnNewMessage("Started");
this.OnNewMessage("Done");
}
}
}
输出为:
message 0
message 1
message 2
Starting
我希望输出为:
message 0
message 1
message 2
Starting
Component message from SSE
Component message from SSE
Component message from SSE
Component message from SSE
...
- 它适用于服务器端
- 它挂在客户端
Blazor 客户端绝对是单线程的(一个 JS / 浏览器限制)所以当 StartAsync() 需要一个线程(到 运行 异步)然后它会在 运行ning 时阻塞客户端。
结论:这个API不适合运行在浏览器中使用。
我在使用简单的 Blazor 组件时遇到问题。当按下表单中的按钮时,组件应启动一个后台线程,将新元素添加到列表中(使用 SSE HTTP 调用)。在下面的代码中,问题是事件处理程序从未被调用,新消息也没有被渲染。我认为问题是由于 StartAsync() 调用阻塞引起的,但我似乎无法在新线程上得到它 运行。
namespace BlazorTest
{
public class DeepViewerComponent : ComponentBase
{
internal string SecretKey;
internal string PublishableKey;
private void OnNewMessage(string message)
{
this.Messages.Add(message);
this.StateHasChanged();
}
private async Task ComponentMessageReceived()
{
this.Messages.Add("Component message from SSE");
await this.InvokeAsync(StateHasChanged);
}
internal async Task Subscribe()
{
for (int i = 0; i < 3; i++)
{
await Task.Delay(500);
this.OnNewMessage($"message {i}");
}
this.sandBoxClient = new IEXCloudClient(publishableToken: "a", secretToken: "b", signRequest: false, useSandBox: true);
this.sseClient = sandBoxClient.SSE.SubscribeCryptoQuoteSSE(new List<string>() { "btcusdt" });
sseClient.MessageReceived += async (s) => await ComponentMessageReceived();
this.OnNewMessage("Starting");
await sseClient.StartAsync();
this.OnNewMessage("Started");
this.OnNewMessage("Done");
}
}
}
输出为:
message 0
message 1
message 2
Starting
我希望输出为:
message 0
message 1
message 2
Starting
Component message from SSE
Component message from SSE
Component message from SSE
Component message from SSE
...
- 它适用于服务器端
- 它挂在客户端
Blazor 客户端绝对是单线程的(一个 JS / 浏览器限制)所以当 StartAsync() 需要一个线程(到 运行 异步)然后它会在 运行ning 时阻塞客户端。
结论:这个API不适合运行在浏览器中使用。