WritingAnimation замораживает пользовательский интерфейс - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь создать WritingAnimator, но он зависает при запуске ... Вот что я сделал:

public partial class Tsia : Form
{
    [...]

    private void TypeText()
    {
        WritingAnimator("Some text");
        WritingAnimator("This is another text");
    }

    private void WritingAnimator(string text)
    {
        foreach (char c in text)
        {
            TextBox1.AppendText(c.ToString());
            Thread.Sleep(100);
        }
    }
}

Поэтому я искал в Google и нашел способ избежать зависания пользовательского интерфейса с помощью других потоков:

public partial class Tsia : Form
{
    [...]

    private void TypeText()
    {
        WritingAnimator("Some text");
        WritingAnimator("This is another text");
    }

    private async void WritingAnimator(string text)
    {
        foreach (char c in text)
        {
            TextBox1.AppendText(c.ToString());
            await Task.Delay(100);
        }
    }
}

Но он печатает что-то вроде смеси «Некоторый текст» и «Это другой текст» из-за WritingAnimator («Это другой текст»); не ждите конца WritingAnimator («Немного текста»); ...

Как я мог это исправить?

1 Ответ

0 голосов
/ 05 мая 2018
public partial class Tsia : Form
{
    [...]

    private async Task TypeText()
    {
        await WritingAnimator("Some text");
        await WritingAnimator("This is another text");
    }

    private async Task WritingAnimator(string text)
    {
        foreach (char c in text)
        {
            TextBox1.AppendText(c.ToString());
            await Task.Delay(100);
        }
    }
}

"Поэтому я искал в Google и нашел способ избежать зависания интерфейса пользователя с помощью используя другие темы "

await / async - это функция языка C # , поскольку версии 5 и Task.Delay - это метод, который является частью параллельной библиотеки задач (TPL) . Все функции TPL + async / await упрощают использование асинхронности для разработчиков.

Еще две мысли:

  • Возможно, вы захотите указать CancellationToken на тот случай, если пользователь захочет остановить анимацию.
  • Существует также соглашение об именах , касающееся методов с асинхронными модификаторами.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...