C# Blazor组件中运行的后台线程和事件处理程序

C# Blazor组件中运行的后台线程和事件处理程序,c#,.net,blazor,blazor-client-side,C#,.net,Blazor,Blazor Client Side,我在让一个简单的Blazor组件工作时遇到了问题。当按下表单中的按钮时,组件应该启动一个后台线程,该线程使用SSE HTTP调用将新元素添加到列表中。在下面的代码中,问题是从未调用事件处理程序,并且没有呈现新消息。我认为问题是由于StartAsync调用阻塞造成的,但我似乎无法在新线程上运行它 namespace BlazorTest { public class DeepViewerComponent : ComponentBase { internal str

我在让一个简单的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
Component message from SSE
Component message from SSE
Component message from SSE
Component message from SSE
...

它在服务器端工作 它挂在客户端 Blazor客户端完全是单线程的,这是JS/浏览器的限制,因此当StartAsync需要一个线程来运行异步时,它将在客户端运行时阻塞

结论:此API不适合在浏览器内运行

它在服务器端工作 它挂在客户端 Blazor客户端完全是单线程的,这是JS/浏览器的限制,因此当StartAsync需要一个线程来运行异步时,它将在客户端运行时阻塞


结论:此API不适合在浏览器中运行。

您是否可以重写代码,以确保它能够帮助人们理解您的问题,快速回答问题,并帮助其他用户解决类似问题。您可以使用来自SSE的.OnNewMessageComponent消息进行.Test;你可以重写你的代码来代替this.Messages.add吗?它可以帮助人们理解你的问题,快速回答问题,并帮助其他用户回答类似的问题。您可以使用来自SSE的.OnNewMessageComponent消息进行.Test;而不是this.Messages.Add
message 0
message 1
message 2
Starting
Component message from SSE
Component message from SSE
Component message from SSE
Component message from SSE
...