Как читать консольный ввод при использовании console.readline, чтобы сохранить процесс также живым? - PullRequest
0 голосов
/ 31 октября 2019

Я изучаю / экспериментирую с консольным приложением SpotifyAPI.Net DotNetCore и испытываю проблемы с чтением пользовательского ввода с консоли. Я думаю, что console.readline () в главном потоке (используется для поддержки консольного приложения) имеет приоритет перед тем, что есть в одном из моих методов. Как получить консольный ввод, если он поддерживает основной поток в одно и то же время?

Я искал это несколько дней, но все, что я могу найти, - это вопросы о том, как поддерживать консольные приложения живыми.

Я начинаю думать, что мне лучше использовать какой-то простой интерфейс?

в моем основном методе:

AuthorizationCodeAuth auth =
                new AuthorizationCodeAuth(_clientId, _secretId, "http://localhost:4002", "http://localhost:4002",
                    Scope.PlaylistReadPrivate | Scope.PlaylistReadCollaborative);
            auth.AuthReceived += AuthOnAuthReceived;
            auth.Start();
            auth.OpenBrowser();
            Console.ReadLine();
            auth.Stop(0);

, а затем AuthOnAuthReceived:

        {
            AuthorizationCodeAuth auth = (AuthorizationCodeAuth) sender;
            auth.Stop();



            Token token = await auth.ExchangeCode(payload.Code);
            SpotifyWebAPI api = new SpotifyWebAPI
            {
                AccessToken = token.AccessToken,
                TokenType = token.TokenType
            };
            PrintUsefulData(api);
        }

PrintusefulData затем делает некоторые вещи, где я хочу получить ввод данных пользовательской консоли с таким дерьмом, как: var input = Console.ReadLine();

Но при отладке он никогда не выходит за пределы этой строки кода, потому что программазавершается, потому что readline в главном потоке получает ввод, а затем завершается.

Я ожидаю, что будет какой-то способ поддерживать консольную программу, одновременно получая некоторый вклад от пользователя в консоли. Но все мои варианты просто заканчиваются из-за пользовательского ввода и никогда не достигают кода, который я хочу использовать для чтения и обработки ввода.

Полагаю, я новичок и упускаю что-то очень очевидное.

1 Ответ

0 голосов
/ 01 ноября 2019

Вы можете взглянуть на примитивы синхронизации , например, ManualResetEvent . Это позволит вам использовать WaitOne вместо ReadLine для ожидания выполнения обратного вызова в вашем методе main. WaitOne будет блокироваться до вызова Set, что вы можете сделать в AuthOnAuthReceive.

...