Программа заканчивается в одном месте по неизвестной причине

Я знаю это из-за точек останова здесь код:

using DSharpPlus;
using DSharpPlus.CommandsNext;
using DSharpPlus.CommandsNext.Attributes;
using DSharpPlus.Entities;
using DSharpPlus.EventArgs;
using DSharpPlus.Interactivity;
using DSharpPlus.Interactivity.Extensions;
using Newtonsoft.Json;
using System.Text;

interface IPermsLevel
{
    PermissionsLevel Suspended { get; set; }
    PermissionsLevel Unverified { get; set; }
    PermissionsLevel Member { get; set; }
    PermissionsLevel VIP { get; set; }
    PermissionsLevel Administrator { get; set; }
}
internal struct PermissionsLevel
{
    internal enum Permslvl : sbyte
    {
        Awaiting = -127,
        Suspended = -2,
        Unverified = -1,
        Member = 0,
        VIP = 1,
        Administrator = 2,
    }

    internal async Task<bool> UserAccessControl(Permslvl AccessLvl, Permslvl MinimumAccessLvl, Permslvl[]? BlockedAccessLvls = null)
    {
        PermissionsLevel.Permslvl permslvl = AccessLvl;
        PermissionsLevel.Permslvl RequestedPermLvl = MinimumAccessLvl;
        PermissionsLevel.Permslvl[] Blocked = BlockedAccessLvls ?? new PermissionsLevel.Permslvl[] { PermissionsLevel.Permslvl.Suspended };
        List<PermissionsLevel.Permslvl> Bypass = new() { PermissionsLevel.Permslvl.Administrator };
        if (Blocked.Length == 0)
        {
            Blocked = new PermissionsLevel.Permslvl[] { PermissionsLevel.Permslvl.Suspended };
        }
        if (Bypass.Contains(permslvl) || permslvl == RequestedPermLvl)
        {
            if (!Blocked.Contains(permslvl) || Bypass.Contains(permslvl))
            {
                await Console.Out.WriteLineAsync("Access Granted");
                return true;
            }
            else
            {
                await Console.Out.WriteLineAsync("Access Denied");
                return false;
            }
        }
        else
        {
            await Console.Out.WriteLineAsync("Acess Denied");
            return false;
        }
    }
}
internal class AccessException : Exception
{
    AccessException(string message, Exception? innerException) : base()
    {
        if (User.AccessExceptionFlagged == true && User.user.AccessLvl != PermissionsLevel.Permslvl.Suspended)
        {
            throw new AccessException("User did not have a role with high enough permissions to access this method!", null);
        }
        else
        {
            throw new AccessException("YOU ARE SUSPENDED", null);
        }
    }
}
internal class User
{
    internal string Name { get; set; } = "Deciding";
    internal PermissionsLevel.Permslvl AccessLvl { get; set; } = PermissionsLevel.Permslvl.Awaiting;
    internal static bool AccessExceptionFlagged = false;
    internal static User user = new();
    internal async static void UserGetInfo()
    {
        Console.Write("ENTER NAME:");
        string Name = Console.ReadLine() ?? "Unknown";
        Console.WriteLine("Verify with discord");
        Console.ReadKey();
        Discord discord = new();
        PermissionsLevel permissions = new();
        discord.RunAsync().GetAwaiter();
        bool Continue = true;
        while (user.AccessLvl == PermissionsLevel.Permslvl.Awaiting && Continue == true)
        {
            await Task.Delay(1000);
            if (user.AccessLvl != PermissionsLevel.Permslvl.Awaiting)
            {
                Continue = false;
            }
        }
        try
        {
            if (Continue == false)
            {
                bool V = await permissions.UserAccessControl(user.AccessLvl, PermissionsLevel.Permslvl.Unverified);
                AccessExceptionFlagged = V;
                await Console.Out.WriteLineAsync("Hello");
            }
        }
        catch (AccessException ex)
        {
            await Console.Out.WriteLineAsync($"Error You didn't meet requirements to access User method sorry ERROR: {ex}");
            await Console.Out.WriteLineAsync("Cheater");
        }
        finally
        {
            UserGetInfo();
        }
    }
}
internal class Discord
{
    internal DiscordClient Client { get; private set; }
    internal InteractivityExtension Interactivity { get; private set; }
    internal CommandsNextExtension Commands { get; private set; }
    internal async Task RunAsync()
    {
        var json = string.Empty;
        using (var fs = File.OpenRead(@"C:\Program Files (x86)\AFLLiveCoLTD\config.json"))
        using (var sr = new StreamReader(fs, new UTF8Encoding(false)))
            json = await sr.ReadToEndAsync();
        var ConfigJson = JsonConvert.DeserializeObject<ConfigJSON>(json);
        var config = new DiscordConfiguration()
        {
            Intents = DiscordIntents.All,
            Token = ConfigJson.Token,
            TokenType = TokenType.Bot,
            AutoReconnect = true,
        };
        Client = new DiscordClient(config);
        Client.UseInteractivity(new InteractivityConfiguration()
        {
            Timeout = TimeSpan.FromMinutes(1)
        });
        var commandsConfig = new CommandsNextConfiguration()
        {
            StringPrefixes = new string[] { ConfigJson.Prefix },
            EnableMentionPrefix = true,
            EnableDms = true,
        };
        Commands = Client.UseCommandsNext(commandsConfig);
        Commands.RegisterCommands<PermCommands>();
        await Client.ConnectAsync();
        await Task.Delay(-1);
    }
    private Task OnClientReady(ReadyEventArgs e)
    {
        return Task.CompletedTask;
    }

    internal struct ConfigJSON
    {
        [JsonProperty("token")]
        internal string Token { get; private set; }
        [JsonProperty("prefix")]
        internal string Prefix { get; private set; }
    }
}
internal class PermCommands : BaseCommandModule
{
    [Command("verifyplvl")]
    internal async Task Permlvl(CommandContext ctx)
    {
        var oermissions = new User();
        IEnumerable<DiscordRole>? role = ctx.Member.Roles;
        if (role.Any() == false)
        {
            User.user.AccessLvl = PermissionsLevel.Permslvl.Unverified;
        }
        else
        {
            if (role.Any(r => r.Id == 894527137250422795))
            {
                User.user.AccessLvl = PermissionsLevel.Permslvl.Administrator;
            }
            else if (role.Any(r => r.Id == 894526951119802368))
            {
                User.user.AccessLvl = PermissionsLevel.Permslvl.Administrator;
            }
            else if (role.Any(r => r.Id == 894525017780551691))
            {
                User.user.AccessLvl = PermissionsLevel.Permslvl.VIP;
            }
            else if (role.Any(r => r.Id == 894522335640580196))
            {
                User.user.AccessLvl = PermissionsLevel.Permslvl.Member;
            }
            else if (role.Any(r => r.Id == 895258073239785472))
            {
                User.user.AccessLvl = PermissionsLevel.Permslvl.Suspended;
            }
        }
        await Console.Out.WriteLineAsync(User.user.AccessLvl.ToString());
        await ctx.Channel.SendMessageAsync($"Your Permission Level is {User.user.AccessLvl}");
    }
}
class Program
{
    public static void Main()
    {
        User.UserGetInfo();
    }
}

Я пытался найти способ заставить его ждать, пока бот Discord завершит команду, потому что он меняет значение, необходимое для того, чтобы метод выдавал информацию, которую хотел бы метод, но теперь у меня есть странная проблема: нет ошибки, но он существует именно тогда, когда он делает то, что я сказал ранее. в конце концов, он должен продолжать работать, это бот для разногласий, а также он должен выполнять метод UserAccessConstrol(); после запроса команды на сервере разногласий. Извините за беспорядочный код, это был тест, чтобы увидеть, как все работает. Он заканчивается на json = await sr.ReadToEndAsync();, когда я запускаю программу, не возникает нулевого исключения, но я буду отлаживать ее в будущем для проверки исключений, но это не проблема, проблема в том, что программа завершается в json = await sr.ReadToEndAsync(); и хочет, чтобы остальная часть discord.RunAsync(); для запуска также, как это стало так плохо и перешло от работы к неработоспособности, заключается в том, что я хотел дождаться значения: internal PermissionsLevel.Permslvl AccessLvl { get; set; } = PermissionsLevel.Permslvl.Awaiting; изменил форму ожидания на любое значение, поэтому метод: internal async Task<bool> UserAccessControl(Permslvl AccessLvl, Permslvl MinimumAccessLvl, Permslvl[]? BlockedAccessLvls = null) имеет значение, которое на самом деле есть у пользователя, потому что, если он запускается раньше это будет работать, но не будет соответствовать роли/уровню доступа пользователя на самом деле.

Добро пожаловать в Stack Overflow. Пожалуйста, четко объясните, что вы делаете и каковы ваши входные данные, а также ожидаемые и фактические результаты. Где он останавливается?

ewokx 11.04.2023 03:44

хорошо, мой ввод для имени - это что угодно, потому что это не имеет значения, но я всегда предоставляю значение, затем я просто нажимаю ввод из-за метода Console.ReadKey(), последний ввод получает онлайн на сервере разногласий, но он даже не доберитесь туда, программа существует еще до того, как она туда попадет, поэтому она не становится онлайн. он заканчивается на json = await sr.ReadToEndAsync(); Я знаю это, потому что использовал точки останова.

Yesalter Yesalt Lastersonal 11.04.2023 03:48
internal async static void UserGetInfo() Вы не можете дождаться завершения этого метода, потому что он не возвращает Task ... Это ваш вопрос?
Jeremy Lakeman 11.04.2023 03:50

нет, мой вопрос в том, что программа существует до загрузки бота разногласий, а также я хочу дождаться завершения выполнения одной из команд бота разногласий, потому что она изменяет значение, необходимое для другого метода, называемого UserAccessControl()

Yesalter Yesalt Lastersonal 11.04.2023 03:52

также, когда я закончу исправлять все ошибки и завершать методы, я могу превратить это в сборку

Yesalter Yesalt Lastersonal 11.04.2023 04:07

также, если это поможет, вот каждое предупреждение, которое у меня есть CS8602 Deference возможной нулевой ссылочной строки 173 col 42, CS8618 Ненулевое свойство «Клиент» должно содержать ненулевое значение при выходе из конструктора. Рассмотрите возможность объявления свойства как обнуляемого, CS8618 Необнуляемое свойство «Интерактивность» должно содержать ненулевое значение при выходе из конструктора. Рассмотрите возможность объявления свойства как обнуляемого

Yesalter Yesalt Lastersonal 11.04.2023 04:15

Эти предупреждения означают, что вы не проверяете null, когда должны, поэтому это очень безопасная ставка, почти уверенность, что у вас есть необработанный NullReferenceException.

madreflection 11.04.2023 06:22

Отвечает ли это на ваш вопрос? Что такое NullReferenceException и как его исправить?

madreflection 11.04.2023 06:22

вот в чем проблема, ничего не возвращает ноль, поэтому даже если бы по этой причине произошел сбой, в этом случае, когда я запускал, каждый путь имел значение, так что это что-то еще, также если там, где ноль, он все равно собирался получить значение, и, к сожалению, это не доходит до той части программы, из которой он вышел до того, как в json = await sr.ReadToEndAsync();

Yesalter Yesalt Lastersonal 11.04.2023 19:32

но я постараюсь исправить эти предупреждения

Yesalter Yesalt Lastersonal 11.04.2023 19:32

Отредактированный пост для уточнения

Yesalter Yesalt Lastersonal 11.04.2023 19:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
11
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. Заставить UserGetInfo возвращать Task вместо void
internal async static Task UserGetInfo()
  1. Измените свой основной метод следующим образом:
static void Main(string[] args)
    {
        Task.Run(async () =>
        {
            await User.UserGetInfo();
        }).GetAwaiter().GetResult();
    }

Наконец, добавьте await в блок finally:

        finally
        {
            await UserGetInfo();
        }

Редактировать :

Вы также можете использовать async main, чтобы сделать код намного чище:

public static async Task Main()
{
    await User.UserGetInfo();
}

Или просто static async Task Main, чтобы не использовать Task.Run. Не нужно слишком усложнять вещи.

madreflection 11.04.2023 06:24

В C# 7.1 или ниже это static async Task Main не разрешено: stackoverflow.com/questions/9208921 @madreflection

Fitri Halim 11.04.2023 06:38

Не проблема: C# 11 помечен. Кроме того, вы можете использовать определенные функции, подобные этой, в более старых средах выполнения, потому что в среду выполнения не добавлено ничего для их поддержки. Вам просто нужно явно указать языковую версию.

madreflection 11.04.2023 10:36

Это работает, но теперь мне нужно решить другие проблемы, которые я сделал, спасибо за помощь.

Yesalter Yesalt Lastersonal 11.04.2023 19:47

@YesalterYesaltLastersonal, пожалуйста, не стесняйтесь делиться другими проблемами, если вам нужна помощь 👌🏻

Fitri Halim 12.04.2023 00:02

Другие вопросы по теме