我是否正确使用 KubernetesClient 和 Blazor 来异步列出对象?

Am I using KubernetesClient correctly with Blazor to list objects asynchronously?

TL/DR:

  1. 我不知道我是否在使用异步编程功能 C# 和 Blazor 正确。
  2. 尽管技术上可行,但如果我做事正确,我需要一些指导。
  3. 此外,我在尝试让“加载微调器”工作时遇到问题。我做错了什么?

我想要一些关于我的代码以正确方式做事的指导。

我目前正在尝试将 KubernetesClient 与 Blazor webapp 结合使用来与我的 kubernetes 集群进行交互。

作为测试,我尝试异步列出集群中的节点。事情似乎可行,但我不确定我是否正确执行此操作。请看下面的代码:

@page "/kclient"
@using k8s

<PageTitle>Kubernetes Client Test</PageTitle>

<h1>Kubernetes Client Test</h1>
<br />
<button class="btn btn-primary" @onclick="@GetNodesAsync">Refresh Node List</button>
<br /><br />
<p>LOADING = @spin.ToString()</p>
<label>Node list:</label>
@if (spin)
{
    <div class="spinner"></div>
}else
{
    <ul>
        @if (MyNodes == null || MyNodes.Count == 0)
        {
            <li>No Nodes. Please try to refresh the node list.</li>
        }else
        {
            @foreach(string node in MyNodes)
            {
                <li>@node</li>
            }
        }

    </ul>
}

@code {
    public bool spin = false;
    public IKubernetes client { get; set; }
    public List<string> MyNodes { get; set; }

    protected override void OnInitialized()
    {
        spin = false;
        KubernetesClientConfiguration config = KubernetesClientConfiguration.BuildConfigFromConfigFile("C:\Users\DevAdmin\.kube\config");
        client = new Kubernetes(config);
        System.Console.WriteLine("Base URI: " + client.BaseUri);
    }

    async Task GetNodesAsync()
    {
        spin = true;
        Task.Delay(1500).Wait();
        await InvokeAsync(GetNodes);   
        spin = false;
        await Task.CompletedTask;
    }

    public async void GetNodes()
    {
        MyNodes = null;
        MyNodes = new List<string>();
        System.Console.WriteLine("=== TRYING TO GET ALL NODES! ===");
        var nodeList = await client.ListNodeAsync();
        if (nodeList.Items.Count == 0)
        {
            Console.WriteLine("Empty! There are no nodes!");
        }
        else
        {
            foreach (var item in nodeList.Items)
            {
                //Console.WriteLine(item.Metadata.Name);
                MyNodes.Add(item.Metadata.Name);
            }
        }
        StateHasChanged();
    }
}

上面的代码生成下面的页面:

当您点击按钮“刷新节点列表”按钮时,它将使用 KubernetesClient 库获取 Kubernetes 节点列表。因为我还是 .NET、Blazor 和异步编程的新手,所以我不确定我检索节点列表然后在 Blazor(razor?)页面中显示它的方式是否正确。

此外,我一直在尝试在等待客户端检索数据时显示一个加载微调器,但我一直无法让它工作,我确定这是因为我没有使用 async/tasks正确。

任何有关我使用 C#/.NET 的异步编程功能或任何其他与我提供的代码的指导,将不胜感激。

提前致谢。

我可以发现一些问题。始终避免 async void.

async Task GetNodesAsync()
{
    spin = true;
    //Task.Delay(1500).Wait();      -- .Wait() blocks the UI
    await Task.Delay(1500);
    //await InvokeAsync(GetNodes);  -- this won't run on another Thread
    await GetNodes();   
    spin = false;
    //await Task.CompletedTask;
}

//public async void GetNodes()
public async Task GetNodes()
{
    ... // as before
    //StateHasChanged();  -- not needed
}