0

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

  private void fPreTrain_Load(object sender, EventArgs e)
        {
            this.TopMost = true;
            Application.DoEvents();
            string path = Application.StartupPath + @"\vids\warmup.mp4";
            axWindowsMediaPlayer1.URL = path;
            if (!File.Exists(path))
            {// Файла нет, качаем
                layoutControlItem2.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always;
                string clean_path = Path.GetDirectoryName(path);
                if (!Directory.Exists(clean_path))
                    Directory.CreateDirectory(clean_path);

                try
                {
                     Task.Run(() => Classes.HttpManager.DownloadFile(
                        "https://hardworkandsweat.com//content/videos/warmup.mp4", path, progressDownload));
                }
                catch
                {
                    layoutControlItem2.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
                    if (Classes.MyForm.Show("Ошибка","Не получилось скачать файл разминки. Открыть видео в браузере?", Classes.MyForm.ftypes.Warning) == DialogResult.Yes);
                        System.Diagnostics.Process.Start("https://hardworkandsweat.com//content/videos/warmup.mp4");
                    return;
                }

                layoutControlItem2.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
                axWindowsMediaPlayer1.Ctlcontrols.play();
            }   
            else       
                axWindowsMediaPlayer1.Ctlcontrols.play();
        }

Если использовать task.wait , то скачивание идёт в фоне, форма не отображается. Если использовать цикл, в котором проверять статус выполнения таска - та же проблема. Нужно и качать и отображать

Antykus
  • 461
  • 2
    Task.Wait() & Task.Result и иже с ними вешают UI их нельзя использовать в общем потоке с граф.интерфейсом. Используйте async/await – Bulson Dec 12 '17 at 11:40
  • Привяжу вопрос на эту тему: https://ru.stackoverflow.com/questions/514529/ – andreycha Dec 12 '17 at 12:49

1 Answers1

2

Попробуйте так:

private async void fPreTrain_Load(object sender, EventArgs e)
{
    this.TopMost = true;
    string path = Application.StartupPath + @"\vids\warmup.mp4";
    axWindowsMediaPlayer1.URL = path;
    if (!File.Exists(path))
    {// Файла нет, качаем
        layoutControlItem2.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always;
        string clean_path = Path.GetDirectoryName(path);
        if (!Directory.Exists(clean_path))
            Directory.CreateDirectory(clean_path);

        try
        {
             await Task.Run(() => Classes.HttpManager.DownloadFile(
                    "https://hardworkandsweat.com//content/videos/warmup.mp4", path, progressDownload));
        }
        catch
        {
            layoutControlItem2.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
            if (Classes.MyForm.Show("Ошибка","Не получилось скачать файл разминки. Открыть видео в браузере?", Classes.MyForm.ftypes.Warning) == DialogResult.Yes);
                await Task.Run(() => System.Diagnostics.Process.Start("https://hardworkandsweat.com//content/videos/warmup.mp4")(;
            return;
        }

        layoutControlItem2.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
        axWindowsMediaPlayer1.Ctlcontrols.play();
    }   
    else       
        axWindowsMediaPlayer1.Ctlcontrols.play();
}

Возможно, надо перед await на DownloadFile показать нужный контрол, а после скрыть (я не знаю, что какой контрол делает в вашем коде).


Проблема в том, что Task.Run создаёт задание, но не дожидается его окончания. Синхронное ожидание окончания задания вешает UI, так что используйте асинхронное, через await.

VladD
  • 206,799