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

3

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.
        }
    }
}
Error: User Rate Limit Exceeded Mitja Bonca

Ваш Ответ

3   ответа
1
   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);
   }
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededhave toError: User Rate Limit Exceededcalling_function().
Error: User Rate Limit Exceeded Xantham
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Xantham
6

Error: User Rate Limit ExceededError: User Rate Limit ExceededError: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

4
MethodInvoker mi = new MethodInvoker(() => progressBar.Progress = newProgressValue);
if (progressBar.InvokeRequired)
{
    progressBar.Invoke(mi);
}
else
{
    mi.Invoke();
}

Error: User Rate Limit Exceeded

  1. InvokeRequired
  2. Invoke
  3. Delegates

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded() => someValue;Error: User Rate Limit Exceededpublic void SomeMethod() { return someValue; }Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded Xantham
Error: User Rate Limit Exceeded Xantham

Похожие вопросы