기존에 작성한 코드에서 실행 시간을 줄여야 하는 상황이 있었습니다.
기존 코드는 아래와 같습니다.
if ( 0 != SomeFunction(1, 2, 3) )
{
Set(false);
return -1;
}
if ( 0 != SomeFunction(4, 5, 6) )
{
Set(false);
return -1;
}
위 코드에서 SomeFunction 함수를 한번씩 호출하는데, 해당 함수가 실행 시간이 걸립니다.
해당 함수는 동시에 호출해도 큰 문제가 없습니다.
따라서 스레드로 정의해서 두 함수를 동시에 호출하면 실행 시간을 줄일 수 있습니다.
또한 해당 함수 중 하나라도 실행 결과가 0이 아니면 -1을 리턴해야 합니다.
스레드는 따로 리턴을 하지 않기 때문에 내부에서 해당 함수의 리턴을 받아야 할 필요가 있습니다.
이를 위해 아래 두 url을 참고하였습니다.
stackoverflow.com/questions/1314155/returning-a-value-from-thread
stackoverflow.com/questions/1195896/threadstart-with-parameters
스레드의 기본 사용 문법은 아래와 같습니다.
Thread thread1 = new Thread(FunctionName);
thread1.Start();
스레드 클래스를 생성할 때 인자로 함수를 전달해주면
Start() 메소드를 호출할 때, 인자로 전달한 함수를 스레드를 통해 실행합니다.
람다식은 함수를 정의하는 방법입니다.
"(a, b) => a + b" 와 같이 C#에서는 =>를 기준으로 좌항은 인자, 우항은 식으로 람다식을 정의합니다.
아래와 같이 코드를 수정하였습니다.
// 스레드 배열 및 함수 결과 저장할 int 배열 정의
Thread[] threads = new Thread[2];
int[] threadReturns = new int[thread.Length];
// 첫번째 스레드 정의
threads[0] = new Thread( () =>
{
threadReturns[0] = SomeFunction(1, 2, 3);
}
);
// 두번째 스레드 정의
threads[1] = new Thread( () =>
{
threadReturns[0] = SomeFunction(4, 5, 6);
}
);
// 스레드 시작
for (int i = 0; i < threads.Length; i++)
{
threads[i].Start();
}
// 스레드가 모두 끝날때까지 대기
for (int i = 0; i < threads.Length; i++)
{
threads[i].Join();
}
// 스레드 내 함수 리턴값이 모두 정상인지 확인
for (int i = 0; i < threads.Length; i++)
{
if (threadReturns[i] != 0)
{
Set(false);
return -1;
}
}
기존 코드에서 스레드로 실행할 부분을 람다식을 이용해서 정의합니다.
이때 각 함수들의 리턴값은 int 배열에 저장합니다.
스레드들을 바로 실행하고,
Join() 메소드를 통해 모든 스레드가 끝날때까지 대기한 후에
스레드 내부에서 저장한 int 배열 값을 통해 리턴값을 확인합니다.
결과적으로 시간을 줄일 수 있었습니다.
'C#' 카테고리의 다른 글
C# Dispatcher를 이용한 thread 점유에 의한 UI 객체 접근 불가 문제 이슈 해결 (0) | 2020.09.14 |
---|---|
C# TwinCAT 설정 접근 방법 (ITcSysManager) (0) | 2020.06.28 |