c # winforms мой пользовательский интерфейс все еще зависает с асинхронной загрузкой событий - PullRequest
0 голосов
/ 15 ноября 2018

В моем случае загрузки формы я вызываю метод loadDg:

private void form_Load(object sender, EventArgs e)
{
  loadDg();
}

и

private async Task loadDg()
        {
            pictureLoading.Visible = true;
            await Task.Run(() => { string[] datas = db.row("select * from products");
string[] datas2 = db.row("select * from users");
double one = Convert.ToInt32(datas[0]);
label1.Text = one.toString();
//....
});
pictureLoading.Visible = false; //hide gif animation 
}

в моем коде, db.row Этот методвсегда возвращает только 1 строку (строковый массив), но мой пользовательский интерфейс по-прежнему зависает, я пытаюсь обновлять пользовательский интерфейс непрерывно с асинхронным без остановки при запуске

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Ничто не мешает асинхронному запуску вашего кода.pictureLoading будет невидимым даже до завершения задачи.Вы должны исправить проблему межпоточности и логику пользовательского интерфейса следующим образом:

private void form_Load(object sender, EventArgs e)
{
  pictureLoading.Visible = true;
  loadDg();
}


private async Task loadDg()
{

    await Task.Run(() =>
    {
        string[] datas = db.row("select * from products");
        string[] datas2 = db.row("select * from users");
        double one = Convert.ToInt32(datas[0]);

        label1.BeginInvoke((Action)delegate ()
        {
            label1.Text = one.toString();
            //hide gif animation 
            pictureLoading.Visible = false;
        });
        //....
    });

}
0 голосов
/ 16 ноября 2018

Следует избегать ненужного перехода между потоками / контекстом.

Это с лучшим использованием ресурсов:

private async void form_Load(object sender, EventArgs e)
{
    pictureLoading.Visible = true;

    try
    {
        label1.Text = await LoadDgAsync();
    }
    catch
    {
        // error handling
    }
    finally
    {
        pictureLoading.Visible = false;
    }
}


private Task<string> LoadDgAsync()
{
    return Task.Run(() =>
    {
        string[] datas = db.row("select * from products");
        string[] datas2 = db.row("select * from users");
        double one = Convert.ToInt32(datas[0]);

        //....

        return one.toString();
    });
}
0 голосов
/ 15 ноября 2018

Вы вызываете функцию loadDg() синхронно.

Если вы не ожидаете вызова функции loadDg() (поскольку ее тип возврата - Задача) и не делаете функцию form_Load асинхронной, вызов функции будет синхронным.

Правильный способ исправить это ...

private async void form_Load(object sender, EventArgs e)
{
  await loadDg();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...