23 мая 2017 г., 14:17 отCommunityXantham

Обновление индикатора выполнения в C # GUI из другого потока и класса [duplicate]

Possible Duplicate:
Updating a Progress Bar from Another Thread

В моей программе я хотел отделить не-GUI-функции от другого класса и оставить вещи, связанные с GUI, в основном классе. Однако у меня возникают проблемы с обновлением индикатора выполнения, когда один из рабочих методов в рабочем классе выполняет свою работу. Я знаю, что мне придется работать здесь с многопоточностью, но я не понимаю как. Может быть, я просто упускаю простые вещи, но когда я ищу информацию об этом, кажется, что большинство уроков говорят о мелочах, но не очень хорошо объясняют общую картину. Я частично понимаю, что такое команды вызова и делегирования, но я не совсем понимаю, как они взаимодействуют.

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

Основная форма класса:

public partial class Form1 : Form
{
    time_waster thing = new time_waster();

    public Form1()
    {
        InitializeComponent();
        progressBar1.Minimum = 0;
        progressBar1.Maximum = 100;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        thing.something_that_takes_a_while();
    }
}

Separate worker class: class time_waster { public time_waster() { }

    public void something_that_takes_a_while()
    {
        int delay = 200;
        for (int i = 0; i < 100; i++)
        {
            Thread.Sleep(delay);
            //appropriate code to update the progress bar for each iteration of the for loop.
        }
    }
}

Ответы на вопрос(0)

23 мая 2012 г., 23:56 отBTownTKD

. BackgroundWorker, который предоставляет методы для сообщения о ходе фонового потока в событии. Событие автоматически вызывается в потоке, который создал BackgroundWorker (обычно это поток пользовательского интерфейса).

Подписаться на это событие «ProgressChanged» и обновить индикатор выполнения в этом обработчике событий. В официальной документации MSDN приведен пример кода.

23 мая 2012 г., 20:37 отCrisfole
MethodInvoker mi = new MethodInvoker(() => progressBar.Progress = newProgressValue);
if (progressBar.InvokeRequired)
{
    progressBar.Invoke(mi);
}
else
{
    mi.Invoke();
}

InvokeRequired Invoke Делегаты

Lambda - это просто необычное слово для функции (или метода), которая объявлена встроенной, а не как метод класса или как необработанная функция в языках, которые их поддерживают. Это «анонимно», если вы не назначаете его именованной переменной. Будьте осторожны, потому что они «захватывают» нужные им переменные и могут вести себя немного странно, если вы их не понимаете.

Синтаксис лямбд довольно прост:() => someValue; почти так же, какpublic void SomeMethod() { return someValue; } положить вещи в скобках, чтобы добавить параметры лямбда-выражения. Если у вас есть только один параметр, не стесняйтесь пропустить скобки.

23 мая 2012 г., 20:40 отJohn Wakefield
   static main()
    {
     Thread th = new Thread(calling_function);
     th.start();  
   }


    calling_function()
    {
    //do your work;
   MethodInvoker m = new MethodInvoker( ()=> progressbar.Progress=value);
    progressbar.Invoke(m);
   }

ВАШ ОТВЕТ НА ВОПРОС