我是否正确使用 KubernetesClient 和 Blazor 来异步列出对象?
Am I using KubernetesClient correctly with Blazor to list objects asynchronously?
TL/DR:
- 我不知道我是否在使用异步编程功能
C# 和 Blazor 正确。
- 尽管技术上可行,但如果我做事正确,我需要一些指导。
- 此外,我在尝试让“加载微调器”工作时遇到问题。我做错了什么?
我想要一些关于我的代码以正确方式做事的指导。
我目前正在尝试将 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
}
TL/DR:
- 我不知道我是否在使用异步编程功能 C# 和 Blazor 正确。
- 尽管技术上可行,但如果我做事正确,我需要一些指导。
- 此外,我在尝试让“加载微调器”工作时遇到问题。我做错了什么?
我想要一些关于我的代码以正确方式做事的指导。
我目前正在尝试将 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
}