C Sharp форма в другом потоке

218
10 февраля 2018, 21:32

Здравствуйте! Есть программа. Выполняет объемные операции и виснет намертво. Хотелось бы сделать визуализацию работы.

Сделана форма с гифкой который я открываю в начале выполнения закрываю в конце. Но открывающая форма виснет вместе с основной.

Как я понял её каким то образом нужно вызвать асинхронно. Как это можно реализовать с передачей параметра в вызов и потом закрыть её из основной формы?

Answer 1

Набросал базовый пример, как можно что то запустить параллельно с репортами. Сначала создает новое окно для прогресса, потом запускаем задачу. Task.Run отправит задачу в пул потоков. Как задача завершится, закрываем окно с прогрессом.

class MyForm : Form
{       
    public MyForm()
    {
        var b = new Button();
        b.Click+=RunTask;
        b.Text = "Click Me";    
        this.Controls.Add(b);
    }
    private async void RunTask(object sender, EventArgs e)
    {
        var progress = new Progress<int>();
        var progressWindow = new Form();
        var progressBar = new ProgressBar();        
        progressWindow.Controls.Add(progressBar);           
        progress.ProgressChanged+= (s, v) => progressBar.Value = v;     
        progressWindow.Show();
        await Task.Run(() =>
        {           
            RunSomethingBig(progress);          
        });
        progressWindow.Close();                 
    }   
    private void RunSomethingBig(IProgress<int> progress)
    {
        for (var i = 0; i <= 100; i += 10)
        {
            progress.Report(i);
            Thread.Sleep(1000);
        }
    }
}
Answer 2
Thread thread; //создаем поток
public void Form1()
{
  thread = new thread(gif);
  thread.start
}
public void gif()
{
  //загружаешь гифку
  thread.Abort();
}

А еще можно сделать через backgroundWorker.

READ ALSO
C# Telegram bot как создать inline кнопку [требует правки]

C# Telegram bot как создать inline кнопку [требует правки]

Как создать url кнопку под сообщением бота?

211
Как узнать что вернуло if

Как узнать что вернуло if

Допустим есть чисто прикладная задача: сортировка пузырьком в трехмерном массиве

191
Unity3D(C#) - Как сделать всплыаающие окна?

Unity3D(C#) - Как сделать всплыаающие окна?

Как можно сделать всплывающие окна? Например, дойдя до конца уровня, игра должна остановится, и в центре должно всплыть окно, мол: " Вы завершили...

179
Обнуляются переменные класса

Обнуляются переменные класса

Скажите пожалуйста, почему обнуляются все переменные класса CircleFigure?

231