Длительная задача откладывает выполнение последовательно предыдущего кода после запуска события - PullRequest
1 голос
/ 15 мая 2019

Надеюсь, я правильно описал проблему.

В следующем коде drive.IsReady требуется некоторое время для завершения.До этого есть команда на печать текста «Сканирование дисков ...» в текстовом поле.Текст появляется после завершения foreach().

Почему это происходит и как я могу уведомить пользователя до выполнения долгосрочной задачи?

public Form1()
{
    InitializeComponent();
    button1.Click += new System.EventHandler(this.Button1_Click);
}

private void Button1_Click(object sender, EventArgs e)
{
    richTextBox1.Text = "Scanning drives, please wait...";
    PopulateComboBox();
}

void PopulateComboBox()
{
    System.IO.DriveInfo[] drives = System.IO.DriveInfo.GetDrives();

    foreach (System.IO.DriveInfo drive in drives)
    {
        if (drive.IsReady)
        {
            comboBox1.Items.Add(drive.Name + drive.VolumeLabel);
        }
        else
        {
            comboBox1.Items.Add(drive.Name);
        }
    }            
}

1 Ответ

1 голос
/ 15 мая 2019

Это минимальные изменения, необходимые для асинхронной работы медленной части вашего кода (drive.IsReady).Он не будет работать быстрее, цель состоит в том, чтобы пользовательский интерфейс оставался отзывчивым.

private async void Button1_Click(object sender, EventArgs e) // + async
{
    richTextBox1.Text = "Scanning drives, please wait...";
    await PopulateComboBox(); // + await
}

async Task PopulateComboBox() // async Task instead of void
{
    System.IO.DriveInfo[] drives = System.IO.DriveInfo.GetDrives();

    foreach (System.IO.DriveInfo drive in drives)
    {
        if (await Task.Run(() => drive.IsReady)) // + await Task.Run(() => ...)
        {
            comboBox1.Items.Add(drive.Name + drive.VolumeLabel);
        }
        else
        {
            comboBox1.Items.Add(drive.Name);
        }
    }            
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...