요청을 처리하면서 병렬로 작업을 실행해야 하는 이슈가 있었다.
인터넷에 확인 Backgraoud Task 방식이 있지만, 이는 별도의 작업을 지속적으로 실행하는 별도의 서비스를 생성하는 방안으로, 모니터링등의 지속 실행작업에 용이하고 특정 요청시점에 실행하기에는 Thread 를 통한 작업 실행이 알맞을 것이라는 생각이 들었다.
쓰레드 실행시 가장 많이 찾아본 내용은 바로 인자, 데이터 전달이였다.
작업을 처리하기 위해서 실행하는 스레드이기 때문에 처리할 데이터나 정보를 스레드에 전달해야 하는데, 인터넷에서 찾아본 내용중 가장 바른? 방법이외에도 존재하지만, 내가 읽기에 제일 가독성이 높은 코드로 데이터 전달 방안으로 정리해 보았다.
클래스 자체에 전달 데이터 정의
스레드를 통해 진행할 작업을 위해 먼저 클래스를 생성한다.(스레드는 클래스 단위로 캡슐화 된다.)
그리고 해당 클래스에 전달 받고자 하는 데이터를 정의한다.
아래 예제의 전체 코드이다.
using System;
using System.Threading;
namespace threadapp
{
public class ThreadWork
{
private string msg;
public ThreadWork(string message)
{
msg = message;
}
public void DoSomeThing()
{
Console.WriteLine("Pass to data thread = " + msg);
}
}
class Program
{
static void Main(string[] args)
{
ThreadWork tws = new ThreadWork("Hello World!!");
Thread t = new Thread(tws.DoSomeThing);
t.Start();
//프로그램 종료 방지
Console.ReadKey();
}
}
}
부분별로 설명을 한다면, ThreadWork가 별도의 스레드에서 실행하는 작업이다.
그리고 ThreadWork의 데이터를 전달 받기 위해서 클래스 레벨의 msg라는 전역 변수를 선언하고, public ThreadWork(string message)를 통해 변수를 노출하여 데이터를 받을 수 있게된다.
노출을 통해 받은 데이터를 전역 변수 msg로 저장한다.
그리고 실제 작업 함수은 DoSomeThing에서 전역 변수로 선언된 msg를 통해 사용하게 된다.
위 프로그램 실행하면 아래와 같이 생성한 스레드에 "argumnet 1!!"이라는 값이 잘 전달 된 것을 알 수 있다.
콜백 함수를 통한 스레드에서 데이터 전달
이제 반대로 실행한 스레드에서 데이터를 확인하는 방법을 알아보자. 이 부분이 필요한 이유는 스레드기반으로 동작을 하는 경우 다중 스레드 환경으로 동작하게 된다. 따라서 스레드 외부에 데이터를 전달하여 결과에 따라 전체 데이터 처리를 조정해야 하는 상황이 발생할 수 있다.
실행한 스레드를 통해 가장 손쉽게 데이터를 확인하는 방법은 delegate를 통해서 이벤트를 등록하고 데이터를 전달받는 것이다.
using System;
using System.Threading;
namespace threadapp
{
public delegate void MsgCallback(string line);
public class ThreadWork
{
private string msg;
private MsgCallback callback;
public ThreadWork(string message, MsgCallback callbackDelegate)
{
msg = message;
callback = callbackDelegate;
}
public void DoSomeThing()
{
Console.WriteLine("Pass to data thread = " + msg);
callback("Done!");
}
}
class Program
{
static void Main(string[] args)
{
ThreadWork tws = new ThreadWork("argument 1!!", new MsgCallback(ResultCallback));
Thread t = new Thread(tws.DoSomeThing);
t.Start();
//프로그램 종료 방지
Console.ReadKey();
}
public static void ResultCallback(string line)
{
Console.WriteLine(
"Pass to data main = {0}", line);
}
}
}
위 예제 코드를 실행하면 메인 함수로 스레드에서 데이터를 전달하는 것을 알 수 있다.
'.Net' 카테고리의 다른 글
.NET - HOW to use Parallel For, ForEach (0) | 2020.12.02 |
---|---|
.NET - Semaphore 초기값? initialCount, maximumCount (0) | 2020.12.01 |
.Net - EF 'Entity type 'xxx' has composite primary key defined with data annotations. To set composite primary key, use fluent API.' (0) | 2020.11.26 |
.Net 5 - Visual Studio 사용하기 (0) | 2020.11.18 |
Net - System.Data.SqlTypes.SqlNullValueException: Data is Null (0) | 2020.11.17 |