【发布时间】:2021-03-16 11:32:11
【问题描述】:
我对 c# 非常陌生,为了学习如何使用 API,我正在为 Minecraft 制作用户名可用性检查器。我写了一个半工作的检查器代码:
public async Task GetMojangItems(string username)
{
string response = await client.GetStringAsync("" +
"https://api.mojang.com/users/profiles/minecraft/" + username);
if (response.Contains("name") == true)
{
Console.ForegroundColor = Color.Red;
Console.WriteLine(" [-] " + username + " -> " + response);
}
else if (response.Contains("name") == false)
{
Console.ForegroundColor = Color.Green;
Console.WriteLine(" [+] " + username + " -> " + response);
}
}
以及使用它的函数:
private async void CheckUsernames()
{
Console.WriteLine("");
Console.WriteLine("Username Checker Selected!");
Console.WriteLine("1) Test username");
Console.WriteLine("2) Import username list");
Console.Write("\r\nSelect an option: ");
if (Console.ReadLine() == "1")
{
Console.Write("\r\nChoose a name to check: ");
Program program = new Program();
string nameimput = Console.ReadLine();
await program.GetMojangItems(nameimput);
}
}
但是没有得到可靠的结果,有时检查器会响应(大约 10% 的时间),大多数时候它根本不会响应并且会跳过名称。
此外,我似乎必须在主任务中包含一个额外的检查,否则根本不会有任何检查;
await program.GetMojangItems("closingprogram!");
非常感谢有关 API 的任何帮助,如何解决我对 API 数据的读取问题以始终如一地工作?
// 对不起,如果问题难以理解,我不擅长解释问题...
【问题讨论】:
-
CheckUsernames是void,所以不能等待。这可能是您的问题的原因 -> 返回Task并等待。 -
除此之外,风格评论:
if (response.Contains("name") == true)通常简单写成if (response.Contains("name"))。 -
void只能用于异步事件处理程序:docs.microsoft.com/en-us/dotnet/csharp/programming-guide/… -
谢谢,它似乎工作得更多,但它偶尔仍会跳过名称,我已将 void 更新为 Task 并从 response.Contains 中删除了 true
-
是否在等待 every
async方法?async应该上升到调用堆栈的顶部:不应该有async void方法。