Проблема с Task.Completed

169
13 декабря 2017, 20:28

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

  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 , то скачивание идёт в фоне, форма не отображается. Если использовать цикл, в котором проверять статус выполнения таска - та же проблема. Нужно и качать и отображать

Answer 1

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

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.

READ ALSO
Пред загрузка формы

Пред загрузка формы

Есть форма, которая загружается около 3 секундЧто бы пользователь не видел как она отрисовывается я накрыл всю форму элементом panel и выключаю...

257
Сравнение строк в C#

Сравнение строк в C#

У меня есть две строки

221
SVG глобус, невидимая часть

SVG глобус, невидимая часть

Имеется вращающийся глобус, где при наведении на определенные страны, те подсвечиваютсяПроблема в том, что мне надо, чтобы на задней части...

278
Деструктурирующее присваивание

Деструктурирующее присваивание

При изучении ES-2015 я наткнулся на деструктуризацию и мой пытливый ум решил поэкспериментировать

281