2015-06-09 1 views
2

Я просто хочу, чтобы два индикатора выполнения одновременно увеличивались при нажатии кнопки; я создал два индикатора выполнения и одну кнопку start с двумя потоками t1 и t2, каждый из которых содержит различный метод для увеличения значений двух индикаторов выполнения (t1 для progressbar1 и t2 для progressbar2 соответственно).C# - Одновременно добавляется два индикатора хода (Mutithreading)

Элементы управления У меня есть: Прогресс Бары: progressbar1, progressbar2 и Button button1.

Код выглядит следующим образом:

Thread t1, t2; 
    private void Progressor1() 
    { 
     progressBar1.Minimum = 0; 
     progressBar1.Maximum = 100; 

     for (int i = 0; i <= 100; i++)    
      progressBar1.Value = i; 
    } 

    private void Progressor2() 
    {    
     progressBar2.Minimum = 0; 
     progressBar2.Maximum = 100; 

     for (int j = 0; j <= 100; j++)    
      progressBar2.Value = j;    
    } 

    private void button1_Click(object sender, EventArgs e) // Start Button 
    { 
     t1.Start(); 
     t2.Start(); 
    } 

    private void MultiThreadedcs_Load(object sender, EventArgs e)// Form Load 
    { 
     t1 = new Thread(Progressor1); 
     t2 = new Thread(Progressor2); 
    } 

Во время выполнения он показывает мне следующее сообщение об ошибке:

Error Name = InvalidOperationException Error Message = Cross-thread operation not valid: Control 'progressBar2' accessed from a thread other than the thread it was created on.

Пожалуйста, помогите мне с этим. У меня меньше идеи резьб понятий, я прошел через этот раствор, без прогресса в моей проблеме:

c# threading access to other thread

+2

Как объяснено в связанном вопросе, вы не можете получить доступ к элементам пользовательского интерфейса из других потоков. Неясно, какова ваша цель - в ваших потоках сейчас нет смысла. Вы должны делать * работу * в фоновом потоке и обновлять пользовательский интерфейс в потоке пользовательского интерфейса. Я также посмотрел бы на TPL/async/await - вы не должны использовать 'Thread' напрямую. –

+0

Если я создаю темы в качестве фоновой темы, это решает мою проблему? –

+0

@ ZakiMohammed No. Ваша проблема в том, что вы получаете доступ к пользовательскому интерфейсу из потоков, отличных от потока пользовательского интерфейса. Решение этого действительно зависит от того, что вы на самом деле пытаетесь сделать - ваш код на самом деле не имеет никакого смысла. – Luaan

ответ

0

В методах вы написали, чтобы начать, как новые темы, вы вызываете прогресс бар напрямую , поэтому вы пытаетесь редактировать данные из другого (исходного) потока. Вместо непосредственного редактирования значения прогресс бар, вы должны Invoke метод, который делает, например, так:

for (int j = 0; j <= 100; j++) 
    this.progressBar1.Invoke((Action)() => this.progressBar1.Value = j, null); 
Смежные вопросы