두 스레드가 동시에 클래스의 메서드를 실행하는 응용 프로그램에서 작업하고 있습니다. 이 메서드는 몇 가지 복잡한 계산을 수행하고 결과는 WinForm에 표시됩니다. (나는 스레드 안전 방법을 사용하는 것처럼) 각 스레드가의 WinForm에서 Label
다른 그래서, 내가 스레드 동기화에 대한 어떤 문제를 예상하지 업데이트C#은 스레드 전환을 어떻게 처리합니까?
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);
}
}
: 같은
그래서 내 수업 보인다.
내 업데이트는 동시에 발생해야합니다 (적어도 동시에 발생하는 것 같습니다).
내 양식에 "계산"버튼을 사용자가 클릭, 내가 할 경우 :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();
을 작성했습니다. 마치 윈도우가 전환을 돌보지 않은 것처럼 행동합니다!
왜 이런 일이 발생하는지 알고 싶습니다.
미리 감사드립니다.
무슨 일이 일어날 예정입니까? 일반적으로 나쁜 습관으로 간주되는 몇 가지 사항에 대한 쪽지. 명시 적으로 스레드 우선 순위, 무한 루프를 나타냅니다. 왜 Thread.Sleep 라인이 필요한가요? – kaj
내 문제는 스레드가 제대로 전환되지 않습니다. 실행은 스레드 1이 완료된 다음 스레드 2와 같습니다. 그래서 Thread.Sleep이 스레드를 전환하도록합니다. – Swanand
스레드가 전환되지 않는다는 것을 어떻게 알 수 있습니까? 함수 호출에 따라 각 스레드에서 UI를 한 번만 업데이트합니다. 각 스레드가 작업을 완료하면 호출됩니다. 스레드 1이있는 코드는 스레드 2 이전에 항상 완료됩니다. – dice