Ждать задержку испорченной машинки с эффектом c #? - PullRequest
0 голосов
/ 12 февраля 2019

Я делаю приложение, в которое хочу добавить эффект эффектной машинки без заморозки пользовательского интерфейса с помощью thread.sleep.

Так что я просто искал решение, чтобы найти асинхронную вещькоторый я показал в классе, и все просто сломалось, но я не понимаю, почему.Раньше он работал отлично, но теперь пользовательский интерфейс не работает, но текст содержит случайные символы

old (работает, но пользователь зависает):

    private bool Write(string text)
    {
        foreach (char c in text)
        {
            Console.AppendText(c.ToString());
            System.Threading.Thread.Sleep(5);
        }
        Console.AppendText(Environment.NewLine);
        return true;
    }

new (странные символы не замораживаются)ui):

    private async void Write(string text){
        foreach (char c in text)
        {
            Console.AppendText(c.ToString());
            await Task.Delay(5);
        }
        Console.AppendText(Environment.NewLine);
    }

Я надеялся, что новый код исправит зависание пользовательского интерфейса, что было сделано, но текст буквально не читается ... вот результат до и после:

до (используя старый код с заморозкой пользовательского интерфейса):

ModuleRemover is aan het kijken voor updates.
ModuleRemover is al de laatste versie! (versie 2.4)

после:

MMododuuleleReRemomvoveerr i is s aaanl  hdeet l kaaitjsketen  vveoorsr iuep! d(atveesrs.
ie 2.4)

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Причина зависания пользовательского интерфейса, вероятно, заключается в том, что вы используете поток пользовательского интерфейса.Это замерзнет.

private bool Write(string text)
{
    var t;
    foreach (char c in text)
    {
        t = Task.Run(() => Console.AppendText(c.ToString());
        t.Wait(TimeSpan.FromMilliseconds(50));
    }
    t = Task.Run(() => Console.AppendText(Console.AppendText(Environment.NewLine));
    t.Wait(); // wait for completion.
    return true;
}
0 голосов
/ 12 февраля 2019

С помощью синхронного цикла вы блокируете любые другие действия, пока ваш код не завершит «набор текста».В результате второй вызов Write будет ждать, и вывод не будет смешиваться с выводом первого.

Предположительно с версией async вы запускаете оба вызова Write одновременно и позволяете им выполняться.параллельно - действительно, они будут печатать символы одновременно.

Исправлено: make Write return Task

private async Task Write(string text) …

и await первый вызов перед выполнением второго(может потребоваться, чтобы метод, вызывающий Write, тоже был асинхронным:

await Write("First one");
await Write("Second one");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...