Programming/C# - Window

C# 코드 리뷰 - 1

esoog Polaris 2024. 4. 26. 20:16
반응형

1. 디버깅

 

Debug: 디버그 빌드에 사용

Trace: 디버그 / 릴리즈 빌드에 사용

public static class DebugClass
{
    public static void Debuggging( string dbgMsg  )
    {
        Debug.WriteLine(dbgMsg); //디버그만 출력
        Trace.WriteLine(dbgMsg); // 디버그 릴리즈 모두 출력
        
        // 1. DefaultTraceListener 사용. VS Output 창에 로깅
        Trace.WriteLine("Default Logging");

        // 2. 콘솔에 로깅
        Trace.Listeners.Clear();
        Trace.Listeners.Add(new ConsoleTraceListener());
        Trace.WriteLine("Console Log");

        // 3. 파일에 로깅
        Trace.Listeners.Clear();
        Trace.Listeners.Add(new TextWriterTraceListener("Logs.txt"));
        Trace.AutoFlush = true;
        Trace.WriteLine("File Log");
        //Trace.Flush();  // AutoFlush 하지 않으면 수동으로 Flush 할 것

        // 4. EventLog에 로깅
        Trace.Listeners.Clear();
        Trace.Listeners.Add(new EventLogTraceListener("Application"));
        Trace.WriteLine("My Event Log");

        // 5. 콘솔과 파일에 동시 로깅
        Trace.Listeners.Clear();
        Trace.Listeners.Add(new ConsoleTraceListener());
        Trace.Listeners.Add(new TextWriterTraceListener("Logs.txt"));
        Trace.AutoFlush = true;
        
        // Trace*() 메서드들 사용
        Trace.TraceInformation("My Info");
        Trace.TraceWarning("My Warning");
        Trace.TraceError("My Error");
    }
}

 

 

 

 

 

 

2. 프로세스 실행

Process[] listProcess = Process.GetProcessesByName("프로세스이름");

// 해당 프로세스가 없다면,
if (listProcess.Length < 1)
{
	Process.Start("프로세스 실행 경로");
}

 

 

 

 

 

3. lock 키워드 사용

: 특정 블럭의 코드(Critical Section)를 한번에 하나의 쓰레드만 실행할 수 있도록 해준다. lock()의 파라미터에는 임의의 객체 지정 사용한다. private object obj = new object() 와 같이 필드를 생성한 후, lock(obj)처럼 사용.

using System;
using System.Threading;

namespace MultiThrdApp
{
    class MyClass
    {
        // lock문에 사용될 객체
        private object lockObject = new object();

        public void TestThread()
        {
            for (int i = 0; i < 10; i++)
            {
                new Thread(Thread1).Start();    
            }
        }

        private void Thread1()
        {
            // 한번에 한 쓰레드만 lock블럭 실행
            lock (lockObject)
            {
			Console.WriteLine("A");
    			Thread.Sleep(1000);
    			Console.WriteLine("B");
            }
        }
    }
}

 

 

 

 

 

4. 싱글톤 패턴 클래스 디자인하기

class Singleton
{
    private static Singleton instance=null;

    private Singleton()
    {
    
    }

    public static Singleton Instance
    {
        get
        {
             if (instance == null)
             {
                 instance = new Singleton();
             }
             return instance;
        }
    }
}

// 사용은 Singleton obj1 = Singleton.Instace();

 

 

 

 

 

5. 스레드 사용/ 스레드 리소스 해제 및 소멸

public class MyClass : IDisposable
{
    private bool isThreadRunning = false;
    private Thread thread;

    public MyClass()
    {
        thread = new Thread(ThreadMethod);
        thread.Start();
    }

    private void ThreadMethod()
    {
        while (!isThreadRunning)
        {
            // 스레드가 실행되는 동안 계속 반복
        }
    }
    
    public void Dispose()
    {
        StopThread();
        GC.SuppressFinalize(this);
    }

    private void StopThread()
    {
        isThreadRunning = true;
        if (thread != null && thread.IsAlive)
        {
            thread.Join(); // 스레드가 종료될 때까지 대기(스레드 안전 종료)
            // thread.Abort(); // 스레드 강제 종료 필요시 사용.
        }
    }
}


// 사용법
using (MyClass myObject = new MyClass())
{
    // myObject 사용
} // 이 지점에서 Dispose가 자동으로 호출됩니다.

 

728x90

'Programming > C# - Window' 카테고리의 다른 글

C#/ string.Format() 사용  (0) 2024.01.22
C#/ PLC 제어 관련(가상 시뮬레이터 GX Works2)  (0) 2024.01.20
C#/ Tip 1  (2) 2024.01.03
C#/ 가상 키코드(virtual key)  (2) 2023.12.08
C#/ unsafe 키워드  (0) 2023.12.08