Я работаю над приложением, в котором два потока одновременно выполняют метод из класса.Этот метод выполняет некоторые сложные вычисления, и результат отображается в WinForm.
Таким образом, мой класс выглядит так:
class Comp_func
{
/* Constructor */
public Comp_func()
{
}
public void THE_Complex_func(string One, Int16 Two, Int32 Three)
{
Calculate_this(One);
Thread.Sleep(10);
Calculate_that(Two);
Thread.Sleep(10);
Calculate_thatThat(Three);
Thread.Sleep(10);
Update_lable_in_form(value);
Thread.Sleep(10);
}
}
Каждый поток обновляется по-разному Label
в WinForm, поэтому я ожидаюнет проблем с синхронизацией потоков (так как я использовал Thread Safe Methods).
Мне нужно, чтобы эти обновления происходили одновременно (по крайней мере, кажется, что они происходят одновременно).
Когда пользователь нажимает кнопку "Рассчитать" в моей форме, я делаю:
Comp_func Func1_class = new Comp_func();
Comp_func Func2_class = new Comp_func();
Thread Func1_Thread = new Thread(() => Func1_class.Start_Test("Blah", 2,3));
Thread Func2_Thread = new Thread(() => Func2_class.Start_Test("BlahBlah", 4,5));
//Func1_Thread.Priority = ThreadPriority.Highest; /* Deleted after Comments */
// Func2_Thread.Priority = ThreadPriority.Highest; /* Deleted after Comments */
Func1_Thread.Start();
Func2_Thread.Start();
/*
// Removed after Comments
// Let only Threads Run
while(true)
{
Application.DoEvent();
Update();
}
for(count = 0; count < 100; count++)
{
console.WriteLine("I WON'T USE WHILE(1) loops with DOEVENTS");
}
*/
Моя проблема в том, что когда выполнение потока 1 завершается, он обновляет Label
, а затем запускается и выполняется поток 2.
Чтобы избежать такого поведения, я писал Thread.Sleep();
после почти каждой строки.Он по-прежнему ведет себя так, как будто Windows не позаботился о переключении!
Есть идеи, почему это происходит?
Заранее спасибо!