簡體   English   中英

使用 HttpContent.ReadAsAsync 時代碼停止

[英]Code stops when using HttpContent.ReadAsAsync

我正在嘗試從 HttpContent 讀取異步,但我的代碼存在於此方法中。 它曾經可以工作,但我最近不得不切換到控制台應用程序,因為我想制作一個 discord 機器人。 當我在控制台應用程序中使用它時,有誰知道為什么代碼“停止”?

我已經嘗試按照建議使用 async Main 但它不起作用

我正在使用這段代碼:

public class BazaarInfo
{
    [JsonProperty("products")]
    public List<BazaarProduct> Products { get; set; }
    public static async Task<BazaarInfo> BuildAsync()
    {
        string url = "https://api.hypixel.net/skyblock/bazaar";

        using (HttpResponseMessage response = await ApiHelper.GetApiClient("application/json").GetAsync(url))
        {
            if (response.IsSuccessStatusCode)
            {
                BazaarInfo output = await response.Content.ReadAsAsync<BazaarInfo>(); //Stops

                return output;
            }
            else
            {
                return null;
            }
        }
    }
}

我從這里調用它:

public class Bazaar
{
    public Dictionary<string, BazaarProduct> Products { get; set; }

    public static async Task<Bazaar> BuildAsync()
    {
        var output = new Bazaar();

        var bazaarInfo = await BazaarInfo.BuildAsync();
        output.Products = bazaarInfo.Products.ToDictionary(product => product.Name);

        return output;
    }
}

和這個:

 [Command("bazaar")]
    public async Task BuildBzItem ([Remainder]string id)
    {
        var bazaar = await Bazaar.BuildAsync();

        string sellSummary = "";
        foreach (var summary in bazaar.Products[id].SellSummary)
            sellSummary += summary.Amount + summary.Price;

        var builder = new Discord.EmbedBuilder()
        {

            Description = sellSummary
        };

        await ReplyAsync("", false, builder.Build());
        
    }

然后在這里使用 discord 聊天事件:

    private async Task HandleCommandAsync(SocketMessage arg)
    {
        var message = arg as SocketUserMessage;
        var context = new SocketCommandContext(Client, message);

        if (message.Author.IsBot) return;

        int argPos = 0;
        if(message.HasStringPrefix("!", ref argPos))
        {
            var result = await Commands.ExecuteAsync(context, argPos, Services);
            if (!result.IsSuccess) Console.Write(result.ErrorReason);
        }
    }

這個事件是在這里分配的:

    public static async Task Main(string[] args) => await new Program().RunBotAsync();

    private DiscordSocketClient Client { get; set; }
    private CommandService Commands { get; set; }
    private IServiceProvider Services { get; set; }

    public async Task RunBotAsync()
    {
        Client = new DiscordSocketClient();
        Commands = new CommandService();
        Services = new ServiceCollection().AddSingleton(Client).AddSingleton(Commands).BuildServiceProvider();

        string token = "ODQ1MzE1OTY2OTcxODA1NzI3.YKfL1w.SPXi_0xXbbrMziZ9JWiqHFX4dto";

        Client.Log += ClientLog;

        await RegisterCommandsAsync();

        await Client.LoginAsync(TokenType.Bot, token);

        await Client.StartAsync();

        await Task.Delay(-1);
    }

    private Task ClientLog(LogMessage arg)
    {
        Console.WriteLine(arg);
        return Task.CompletedTask;
    }

    public async Task RegisterCommandsAsync()
    {
        Client.MessageReceived += HandleCommandAsync;
        await Commands.AddModulesAsync(Assembly.GetEntryAssembly(), Services);
    }

  

我已經嘗試按照建議使用 async Main 但它不起作用

如果您不能使用async Main ,則在Main方法中阻塞:

public static void Main(string[] args) => new Program().RunBotAsync().GetAwaiter().GetResult();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM