Почему не-пользовательский поток блокирует пользовательский интерфейс? - PullRequest
0 голосов
/ 01 июня 2018

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

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

public partial class MainPage : ContentPage
{
    private event EventHandler<double> ProgressChanged;

    public MainPage()
    {
        InitializeComponent();

        button.Clicked += Button_Clicked;
        ProgressChanged += MainPage_ProgressChanged;
    }

    private void Button_Clicked(object sender, EventArgs e)
    {
        new Thread(() =>
        {
            for (double i = 0; i <= 1; i += .00001)
            {
                ProgressChanged.Invoke(this, i);
            }
        }).Start();
    }

    private void MainPage_ProgressChanged(object sender, double e)
    {
        Device.BeginInvokeOnMainThread(() =>
        {
            progressBar.Progress = e;
        });
    }
}

1 Ответ

0 голосов
/ 01 июня 2018

Предполагая частоту обновления экрана 16,6 мс на устройстве, вы запускаете 100 000 сообщений в пользовательский интерфейс / основной поток как fast как forцикл может выполняться в фоновом потоке.

Теперь пользовательский интерфейс должен обрабатывать эти сообщения (16,6 мс * 100 000) / 1000 мс / с, и у вас есть 27 минут обновлений.Это просто непрактично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...